Promise的串行调用并行调用理解

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值