Async函数实用指南

栏目: JavaScript · 发布时间: 5年前

内容简介:在JavaScript里,所有的操作都是通过异步完成,不需要像python一样按顺序执行,非常容易因为某个函数执行速度过慢导致整个程序阻塞,从效率上来说远远低于JavaScript的原生异步机制。当然,python也可以实现异步功能,但是会麻烦不少,尤其对于一些代码量少的小爬虫非常不友好。在我上篇爬虫文章里就提到了不少异步带来的好处,但同时坏处也不少,很多时候会导致输出的结果并不是我们想要的。比如我们希望在爬取到所有的数据后才开始执行处理函数,但JavaScript会在爬取数据的同时执行处理函数,直接导致爬

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

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

0.举个例子:

const getWeb = function(){
    requestSomething()
    setData()
    return console.log(“3.程序结束”)
}

const requestSomething = function(){
    setTimeout(() => console.log(‘1.网页数据爬取完毕!’),2000)
}

const setData = function(){
    console.log(‘2.开始处理数据!’)
}

getWeb()
复制代码

输出结果:

Async函数实用指南

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

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

1.如何创建Async使用

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

const getWeb = async function(){
    await requestSomething()
    setData()
    return console.log(“3.程序结束”)
}
复制代码

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

const requestSomething = function(){
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(‘1.网页数据爬取完毕!’)
            resolve()
        },2000)
    })
}
复制代码

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

Async函数实用指南

2.如何处理错误

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

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.程序结束”)
}
复制代码

输出结果:

Async函数实用指南

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

完整代码: github.com/Card007/Nod…

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


以上所述就是小编给大家介绍的《Async函数实用指南》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

八年级数学(华东师大版)-解题升级-解题快速反应一本通(新课标)

八年级数学(华东师大版)-解题升级-解题快速反应一本通(新课标)

孙丽敏等编 / 吉林教育出版社 / 2004-6 / 10.0

本书将与知识点、重点、难点和考点有关的典型题做全析全解,是具有解题题典性质的助学读物。但本书又优于解题题典,不仅展示解题过程,更详细地提供了解题思考过程和切入点的选择方法,教方法导引思路的功能更强。 学生要提高解题能力,必须具备两个条件:一是打好基础,二是能够运动所学知识分析问题和解决问题。本书用例题解析解说知识点、重点、难点和考点,同时提供解题思考过程,在打基础中激活能力,在解题实......一起来看看 《八年级数学(华东师大版)-解题升级-解题快速反应一本通(新课标)》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

html转js在线工具
html转js在线工具

html转js在线工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具