Promise.all([]).then()同步执行多个异步操作,全部执行完毕,再执行then
写法
//模拟异步操作
function a(){//a异步
return new Promise(function(resolve){
console.log(`a起跑...`);
setTimeout(function(){//异步
console.log(`a到达终点!`);
resolve();//自动执行.then()中串联的下一项任务
},6000)
})
}
function b(){//b异步
return new Promise(function(resolve){
console.log(`b起跑...`);
setTimeout(function(){//异步
console.log(`b到达终点!`);
//之后,主动调用resolve
resolve(); //通知.then中串联的下一项任务可以开始执行!
},4000)
})
};
function c(){//c异步
return new Promise(function(resolve){
console.log(`c起跑...`);
setTimeout(function(){//异步: 在主程序之外
console.log(`c到达终点!`);
resolve();
},2000)
})
};
//同步执行上面的异步操作,只有等三个全部执行完毕,才会执行then
Promise.all([
//只有调用异步函数,才能返回new Promise()格子间
a(),//return new Promise()
//resolve()
b(),//return new Promise()
//resolve()
c()//return new Promise()
//resolve()
]).then(function(){ console.log("比赛结束!") });
如何接返回值
function a(){//a异步
return new Promise(function(resolve){
var bang="a的接力棒";
console.log(`a起跑...`);
setTimeout(function(){//异步
console.log(`a到达终点!`);
//之后,主动调用resolve开门!
resolve(bang);//自动执行.then()中串联的下一项任务
},6000)
})
}
function b(){//b异步
return new Promise(function(resolve){
var bang="b的接力棒";
console.log(`b起跑...`);
setTimeout(function(){//异步
console.log(`b到达终点!`);
//之后,主动调用resolve
resolve(bang); //通知.then中串联的下一项任务可以开始执行!
},4000)
})
}
function c(){//c异步
return new Promise(function(resolve){
var bang="c的接力棒";
console.log(`c起跑...`);
setTimeout(function(){//异步: 在主程序之外
console.log(`c到达终点!`);
resolve(bang);
},2000)
})
}
//希望三个人百米赛跑(谁也不等谁),但是最后一个人跑完时,才输出比赛结束!
Promise.all([
//只有调用异步函数,才能返回new Promise()格子间
a(),//return new Promise()
//resolve()
b(),//return new Promise()
//resolve()
c()//return new Promise()
//resolve()
]).then(function(arr){
console.log("比赛结束!");
console.log(arr);//三个人返回的三个接力棒
arr为以上函数的返回值
});
? arr中接力棒的顺序是按照all中数组的顺序,还是按照异步函数结束的顺序
按照上面函数的书写顺序['a的接力棒','b的接力棒','c的接力棒']
没有定返回值的异步函数,返回值为undefined