什么时候用promise.all 什么时候用async和await
什么时候用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)
})
}
1、我们先测试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
但是这样的话 执行时间好像就有点长了,实际需求吧。
————————————————
版权声明:本文为CSDN博主「yunchong_zhao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yunchong_zhao/article/details/104009851