Promise setTimeout NextTick执行顺序

const first = () => (new Promise((resolve, reject) => {
    console.log(3);
    let p = new Promise((resolve, reject) => {
        console.log(7);
        setTimeout(() => {
            console.log(5);
            resolve(6);
        }, 0)
        resolve(1);
    });
    resolve(2);
    p.then((arg) => {
        console.log(arg);
    });

}));

first().then((arg) => {
    console.log(arg);
});
console.log(4);

事件循环,先执行宏任务,主script,new Promise立即执行而后微任务,然后第二轮事件循坏直至结束。

Event Quene 执行顺序为宏任务(macrotask)==> 微任务(microtask)==> ... 

第一步:执行first() 遇new Promise立即执行,promise为同步,其resolve reject 为异步 ,故log(3)入宏任务队列中;

第二步:遇new promise 立即执行,log(7)入宏任务队列;

第三步:遇setTimeout 入下一轮事件循坏;

第四步:遇resolve(1)入微任务队列;

第五步:遇resolve(2)入微任务队列;

第六步:log(4)入宏任务队列;

第七步:进行第二轮事件循坏,开始读取setTimeout,遇log(5)入第二轮宏任务队列;

第八步:遇resolve(6)入微任务队列,微任务是异步的,故微任务队列只有一轮,同时由于resolve(1)该promise已经fulfilled,状态不可更改,故resolve(6)无效为undefined;

第九步:按照队列的先进先出,Event Quene的执行顺序依次出列,3 4 7 1 2 undefined 5;

总结

哪些是宏任务/微任务?

宏任务微任务
setTimeoutprocess.nextTick
setIntervalMutationObserver
MessageChannelPromise.then
requestAnimationFrame

参考此表格和以上分析,基本能确定输出顺序了

另外async awati执行顺序,参考

Jamki小烽烽
博客,总结的非常不错

(45条消息) 一道面试题:还在纠结async/ await、Promise的执行顺序?_m0_37922914的博客-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值