JavaScript异步执行顺序疑问:为何指定代码输出结果为1 3 4 2 6 5
JavaScript代码输出逻辑解释
你提供的代码输出顺序由JavaScript事件循环中同步任务优先于微任务执行、微任务按入队顺序依次执行的规则决定,具体执行步骤如下:
Promise.resolve().then(() => console.log(2)); (async() => console.log(await 6))(); console.log(1); (async() => await console.log(3))(); Promise.resolve().then(() => console.log(5)); console.log(4);
- 步骤1:执行第一行代码,
Promise.resolve()生成已兑现的Promise,then回调属于微任务,被推入微任务队列等待执行,此时微任务队列:[() => console.log(2)] - 步骤2:执行第二行的立即调用async函数,遇到
await 6时,会先将6封装为已兑现的Promise,await会暂停当前async函数的执行,将剩余逻辑console.log(6)作为微任务推入队列,此时微任务队列:[() => console.log(2), () => console.log(6)] - 步骤3:执行第三行同步代码
console.log(1),直接输出1 - 步骤4:执行第四行的立即调用async函数,await后的表达式
console.log(3)会先同步求值,直接输出3,后续无需要执行的代码,无新增可输出的微任务 - 步骤5:执行第五行代码,
then回调被推入微任务队列,此时微任务队列:[() => console.log(2), () => console.log(6), () => console.log(5)] - 步骤6:执行第六行同步代码
console.log(4),直接输出4 - 步骤7:所有同步任务执行完毕,按入队顺序依次执行微任务队列中的回调,依次输出
2、6、5
最终输出顺序为1 3 4 2 6 5。
内容的提问来源于stack exchange,提问作者trigold
相关产品推荐
相关产品推荐

