在JavaScript里,全部的操做都是经过异步完成,不须要像python同样按顺序执行,很是容易由于某个函数执行速度过慢致使整个程序阻塞,从效率上来讲远远低于JavaScript的原生异步机制。固然,python也能够实现异步功能,可是会麻烦很多,尤为对于一些代码量少的小爬虫很是不友好。javascript
在我上篇爬虫文章里就提到了很多异步带来的好处,但同时坏处也很多,不少时候会致使输出的结果并非咱们想要的。好比咱们但愿在爬取到全部的数据后才开始执行处理函数,但JavaScript会在爬取数据的同时执行处理函数,直接致使爬虫出错。java
const getWeb = function(){
requestSomething()
setData()
return console.log(“3.程序结束”)
}
const requestSomething = function(){
setTimeout(() => console.log(‘1.网页数据爬取完毕!’),2000)
}
const setData = function(){
console.log(‘2.开始处理数据!’)
}
getWeb()
复制代码
输出结果: python
看到结果咱们发现,明明是爬取网页的requestSomething函数先执行,可是先输出结果的倒是处理函数setData,甚至在整个getWeb函数返回后才开始输出爬取结果。git
为了解决这个问题,束缚住JavaScript这匹脱缰的野马,这里就须要用到Async函数,让JavaScript程序能按照咱们但愿的顺序执行。github
首先要建立一个async函数,在咱们但愿控制异步的地方使用await来进行控制,好比:异步
const getWeb = async function(){
await requestSomething()
setData()
return console.log(“3.程序结束”)
}
复制代码
接下来还须要改造requestSomething函数,首先直接返回一个Promise对象,里面经过匿名函数接收两个参数,分别是resolve和reject,当执行resoleve()时表示当前函数执行完毕,而reject()则是返回错误信息,咱们先来看resoleve:async
const requestSomething = function(){
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(‘1.网页数据爬取完毕!’)
resolve()
},2000)
})
}
复制代码
来运行一下改造后的代码: 函数
还记得有一个reject命令吗?在爬取失败时,能够经过reject返回失败内容,而后使用catch方法来输出,如今,来改造一下代码,在爬取失败时输出失败信息:ui
const requestSomething = function(){
return new Promise((resolve, reject) => {
let err = ‘1.爬取失败!’
if(typeof err != ‘undefined’){
//返回错误信息
reject(err)
} else (
setTimeout(() => {
console.log(‘1.网页数据爬取完毕!’)
resolve()
},2000)
)
})
}
const getWeb = async function(){
//经过catch捕捉返回的错误信息
await requestSomething().catch(e => console.log(e))
setData()
return console.log(“3.程序结束”)
}
复制代码
输出结果: spa
至此,咱们已经成功控制住了异步程序,能够在小爬虫里直接应用了!
完整代码: github.com/Card007/Nod…
也欢迎访问个人主页: Nothlu’s Blog