1Promise 串行调用
1)什么是Promise串行
Promise串行是指每一个由promise封装的任务都顺序执行,即上一个执行完成后再执行下一个。
let arr = [
new Promise(res=>{
setTimeout(()=>{
res(1)
},3000)
}),
new Promise(res=>{
setTimeout(()=>{
res(2)
},2000)
}),
new Promise(res=>{
setTimeout(()=>{
res(3)
},1000)
})]
function iteratorPromise(arr){
//补充代码
}
iteratorPromise(arr);
//实现以下依次输出
/**
1
2
3
*/
基本思路:将每个promise的.then串联起来就好,就是在上一个promise.then里返回下一个promise,所以我们可以使用for循环将这个.then串联起来,说干就干:
for(let i = 0;i<arr.length;i++){
arr[i].then((num)=>{
console.log(num)
return arr[i+1]
})
}
可是它真的会依次输出
1
2
3
吗?????
不会,它会依次输出
3
2
1
卧槽,这是为啥,我满脸的❓❓
为啥,为啥?这是因为,promise.then里面的才是微任务,所以当你执行执行上面for循环时,他会先把3个setTimeout放进宏任务队列,即使你没有return arr[i+1],它也会输出3,2,1,还是不明白吗,看下面这个代码就明白了。
const promise = new Promise((resolve, reject) => {
console.log(1);
setTimeout(() => {
console.log("timerStart");
resolve("success");
console.log("timerEnd");
}, 0);
console.log(2);
});
promise.then((res) => {
console.log(res);
});
console.log(4);
上面这个代码:
1.从上至下,先遇到new Promise,执行该构造函数中的代码console.log(1)
2.然后碰到了定时器,将这个定时器中的函数放到下一个宏任务的延迟队列中等待执行
3.执行同步代码console.log(2)
4.跳出promise函数,遇到promise.then,但其状态还是为pending,这里理解为先不执行
5.执行同步代码console.log(4)
6.一轮循环过后,进入第二次宏任务,发现延迟队列中有setTimeout定时器,执行它
7.首先执行console.log(“timerStart”),然后遇到了resolve,将promise的状态改为resolved且保存结果并将之前的promise.then推入微任务队列
8.继续执行同步代码console.log(“timerEnd”)
9.宏任务全部执行完毕,查找微任务队列,发现promise.then这个微任务,执行它。
这下明白了吧,如果还不明白请看事件循环
怎么才能修改上面的for循环才能让他依次执行呢????
async function iteratorPromise(arr) {
for (let i = 0; i < arr.length; i++) {
const num = await arr[i];//等待每个arr[i]都执行后在执行下一次循环
console.log(num);
}
}
这样就会依次输出
1
2
3
2Promise 串行调用
就是promise,all