当前位置:   article > 正文

async python两个_摆脱js回调地狱,Async/Await实用指南,完美实现同步操作

python async变成同步

aa0aeb64eff050b9ea0d2a7c93601f54.png

在JavaScript里,所有的操作都是通过异步完成,不需要像python一样按顺序执行,非常容易因为某个函数执行速度过慢导致整个程序阻塞,从效率上来说远远低于JavaScript的原生异步机制。当然,python也可以实现异步功能,但是会麻烦不少,尤其对于一些代码量少的小爬虫非常不友好。

在我上篇爬虫文章里就提到了不少异步带来的好处,但同时坏处也不少,很多时候会导致输出的结果并不是我们想要的。比如我们希望在爬取到所有的数据后才开始执行处理函数,但JavaScript会在爬取数据的同时执行处理函数,直接导致爬虫出错。

0.现在来看个例子:

  1. const getWeb = function(){
  2. requestSomething()
  3. setData()
  4. return console.log("3.程序结束")
  5. }
  6. const requestSomething = function(){
  7. setTimeout(() => console.log('1.网页数据爬取完毕!'),2000)
  8. }
  9. const setData = function(){
  10. console.log('2.开始处理数据!')
  11. }
  12. getWeb()

输出结果:

d88fa4fe5f31dfc38293f81b661f6793.png

看到结果我们发现,明明是爬取网页的requestSomething函数先执行,但是先输出结果的却是处理函数setData,甚至在整个getWeb函数返回后才开始输出爬取结果。

为了解决这个问题,束缚住JavaScript这匹脱缰的野马,这里就需要用到Async函数,让JavaScript程序能按照我们希望的顺序执行。

1.如何创建Async使用

首先要创建一个async函数,在我们希望控制异步的地方使用await来进行控制,比如:

  1. const getWeb = async function(){
  2. await requestSomething()
  3. setData()
  4. return console.log("3.程序结束")
  5. }

接下来还需要改造requestSomething函数,首先直接返回一个Promise对象,里面通过匿名函数接收两个参数,分别是resolve和reject,当执行resoleve()时表示当前函数执行完毕,而reject()则是返回错误信息,我们先来看resoleve:

  1. const requestSomething = function(){
  2. return new Promise((resolve, reject) => {
  3. setTimeout(() => {
  4. console.log('1.网页数据爬取完毕!')
  5. resolve()
  6. },2000)
  7. })
  8. }

来运行一下改造后的代码:

8611d64720fa50e3aa445f016af4ba79.png

2.如何处理错误

还记得有一个reject命令吗?在爬取失败时,可以通过reject返回失败内容,然后使用catch方法来输出,现在,来改造一下代码,在爬取失败时输出失败信息:

  1. const requestSomething = function(){
  2. return new Promise((resolve, reject) => {
  3. let err = '1.爬取失败!'
  4. if(typeof err != 'undefined'){
  5. //返回错误信息
  6. reject(err)
  7. } else (
  8. setTimeout(() => {
  9. console.log('1.网页数据爬取完毕!')
  10. resolve()
  11. },2000)
  12. )
  13. })
  14. }
  15. const getWeb = async function(){
  16. //通过catch捕捉返回的错误信息
  17. await requestSomething().catch(e => console.log(e))
  18. setData()
  19. return console.log("3.程序结束")
  20. }

输出结果:

03cb622ec6b6680b26c74799d6028707.png

至此,我们已经成功控制住了异步程序,可以在小爬虫里直接应用了!

完整代码:https://github.com/Card007/Node-examples/blob/master/Async.js

也欢迎访问我的主页:Nothlu's Blog

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/102658
推荐阅读
相关标签
  

闽ICP备14008679号