前端面试题 什么时候用promise.all 什么时候用async和await

碰见这样的面试题 考验的还是我们对上面俩者的理解程度

promise 是用来解决 回调地狱的好方法   将异步的执行代码体 封装到一个函数体内部 返回一个成功的方法 通过 .then()来达到同步的效果

常见的promsie用法是

return  new Promise((resolve,reject)=>{

          setTimeout(()=>{resolve('a')},3000)    //异步代码

}).then(res=>{console.log(res)})  //输出  a

但今天 说的重点并不是这个 而是promise.all方法 和 es7的 await 和async 

awiat 一般是再async中配合使用 当然也可以和 promise.all使用

讲这么多 好像都是废话  还是拿出实际的例子比较有说服力

我创建了三个 里面含有异步执行的函数体

var runA=function(){
            return new Promise((resolve,reject)=>{
                setTimeout(function(){
                    console.log('3秒后 runA方法执行完毕')
                    resolve(new Date())
                },3000)
            })
        }
        var runB=function(){
            return new Promise((resolve,reject)=>{
                setTimeout(function(){
                    console.log('6秒后 runB方法执行完毕')
                    resolve(new Date())
                },6000)
            })
        }
        var runC=function(){
            return new Promise((resolve,reject)=>{
                setTimeout(function(){
                    console.log('9秒后 runC方法执行完毕')
                    resolve(new Date())
                },9000)
            })
        }

我们先测试  promise.all方法   因为这个方法我在工作中也曾经用过

Promise 的 all() 方法提供了并行执行异步操作的能力,即在所有异步操作执行完后才执行回调, all()里面接收一个数组,数组中每个元素都返回一个 promise 对象。

console.log(new Date());   //代码开始时间
        // // Promise.all 放进去所有异步执行代码 最后统一返回结果


Promise.all([runB(),runA(),runC()]).then((res)=>{console.log(res)}) //这里我特意将 runA和runB方法 在数组中的位置更换了一下

可以看到虽然 我在数组中更换了 俩个方法的 位置但是执行上 还是 方法runA先执行的 而且看执行时间也是 几个异步函数并行执行 所以所有的执行完成总共花了  9秒钟  这样可以看出promise.all的执行时间取决于 执行时间最长的哪一个函数

不过 回来的数据顺序还是 按照  数组中的 位置排列的  虽然 runA方法先执行的 但结果还是 在执行返回的 结果数组中的第二个位置

所以 promise.all 可以用来执行 不关心 执行顺序 只关心 回来结果的顺序的 那种需求

2.那我们再来看看 async和await

async function getDate(){
            var runb=await runB();
            var runa=await runA();
            var runc=await runC();
            console.log('3000',runa);
            console.log('6000',runb);
            console.log('9000',runc);
        }
        getDate();

对比 promise.all  是不是 一目了然了  

async 和awiat 搭配使用 让方法 同步执行  方法就是按照程序的书写顺序依次执行的

虽然 runb在后面打印出来 但它的执行时间确实早于runa  用的总时长 是 所有执行时间的总和 也就是  9+6+3  18秒

这个可以从 执行开始的时间 39.55  到 40.13可以看出来 刚好差距  18秒

所以 如果你关心 函数的执行顺序的话 最好使用 async和await   但是这样的话 执行时间好像就有点长了  看实际需求吧

  • 10
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yunchong_zhao

帮到你了,请作者喝杯矿泉水可好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值