最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 关于 Promise.all 和 async await 这档子事儿

    正文概述 掘金(JS心法)   2021-07-19   899

    本文章主要是对比两者之间使用Promise返回的异步函数的区别。

    ? 计算一下执行时间
    例子1:所有异步函数均为成功

    function promise1(){
        return new Promise(resolve=>{
            setTimeout(()=>{
                resolve()
                console.log("promise1");
            },1000)
        })
    }
    function promise2(){
        return new Promise(resolve=>{
            setTimeout(()=>{
                resolve();
                console.log("promise2");
            },2000)
        })
    }
    function promise3(){
        return new Promise(resolve=>{
            setTimeout(()=>{
                resolve();
                console.log("promise3");
            },3000)
        })
    }
    

    例子2: 修改第一个promise1函数为失败。

    function promise1(){
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                reject("error")
                console.log("promise1");
            },1000)
        })
    }
    

    使用Promise.all

    如果我们使用 Promise.all 来执行 例子1 所有的异步函数,并计算时间

    console.time("test");
    Promise.all([promise1(),promise2(),promise3()]).then(()=>{
        console.log("promise.all执行完毕");
        console.timeEnd("test");
    }).catch(()=>{
        console.log("promise.all执行失败");
        console.timeEnd("test");
    })
    

    我们会得到如下的执行时间:

    关于 Promise.all 和 async await 这档子事儿
    omg,我的老天,这速度太快了。

    可以看到Promise.all 会按顺序执行并且不会阻塞线程,而是等待所有异步执行完毕,结束整套执行。 并且会以执行的完成最慢的异步promise3函数作为结束。很明显这是一组全部执行并且正常回调的异步Promise函数。所以执行时间耗时 3秒

    接下来让我们看看这个 如果我们将第一个promise1函数修改为reject的回调,会如何执行呢? 代码见例子2

    我们会得到如下结果:

    关于 Promise.all 和 async await 这档子事儿

    Promise.all这个小调皮居然直接执行自己自身的catch失败回调!然后执行了后续的异步函数,这是个感人的故事。。
    所以得出结论:Promise.all 如果遇到失败会立刻执行自身的catch回调并且不会中断后续异步函数的执行。

    但是值得需要注意的是,Promise.all只会抛出多个异步函数中第一个执行失败的信息 也就是所有异步Promise函数中第一个reject!

    使用async await

    有如下代码调用顺序执行 例子1

    async function asyncTime(){
        console.time("aysncTime");
        await promise1();
        await promise2();
        await promise3();
        console.log("async 执行完毕");
        console.timeEnd("aysncTime");
    }    
    

    会得到如下结果:

    关于 Promise.all 和 async await 这档子事儿

    这个时候async就向大家展示了 什么叫"姐就是女王,自信放光芒”,不出意外的阻塞了线程,并且同步按顺序执行并返回。
    同样是等待所有异步执行完毕,并结束。只不过和Promise.all不同的是会单一执行一个异步函数并等到当前异步函数执行到resolve再继续下一异步函数。执行时长是按照依次执行完毕的时间累计而成 6秒

    同样的接下来让我们看看这个 如果我们将第一个promise1函数修改为reject的回调,会如何执行呢?见例子2

    关于 Promise.all 和 async await 这档子事儿

    可以看到会直接中断掉不会进行后续的异步函数执行,并且中断线程,不愧是女王就是有脾气!

    需要注意的是如果需要代码保护继续执行的话,可以加入try...catch来进行异常捕捉! 如下代码:

    async function asyncTime(){
       console.time("aysncTime");
       try{
           await promise1();
           await promise2();
           await promise3();
           console.log("async 执行完毕");
           console.timeEnd("aysncTime");
       }catch (e) {
           console.log("async 执行失败");
           console.timeEnd("aysncTime");
       }
    }
    

    可以正确得到代码保护的结果。虽然会中断剩余异步函数的执行,但是保护了整个线程不会中断!

    关于 Promise.all 和 async await 这档子事儿

    总结

    Promise.all

    1.异步执行多个异步函数,虽然按顺序执行,但是由于异步回调时间不固定的情况下并不能保证执行顺序。
    2.不会阻塞线程,只会在合适的时机调用整体resolve|reject的回调函数。
    3.遇到执行回调中第一个失败。会立刻执行自身的reject的回调函数,并且只会抛出第一个失败reject,后续遇到reject均不执行。
    4.不会因为异步函数的失败,而中断后续所有的异步函数执行。
    5.由于是异步执行所有异步函数,可以更快的捕获异常问题。

    async await

    1.同步执行异步代码,按顺序执行,并阻塞线程保证执行顺序。
    2.会阻塞线程。
    3.遇到执行回调中第一个失败,报错如果不加try...catch会直接中断线程
    4.依次执行保证指定顺序调用异步函数。
    5.简洁的使用语法糖。

    由此以上总结的特性,可以封装成两个执行异步函数的请求集,用于加载显示百分比进度。
    学习总结如有错误,欢迎指正!


    起源地下载网 » 关于 Promise.all 和 async await 这档子事儿

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元