代码示例
console.log(1);
setTimeout(() => {
console.log(2);
Promise.resolve()
.then(() => {
console.log(3);
setTimeout(() => {
console.log(4);
}, 0);
})
.then(() => {
console.log(5);
});
}, 0);
Promise.resolve()
.then(() => {
console.log(6);
setTimeout(() => {
console.log(7);
Promise.resolve()
.then(() => {
console.log(8);
});
}, 0);
})
.then(() => {
console.log(9);
});
new Promise((resolve, reject) => {
console.log(10);
resolve();
})
.then(() => {
console.log(11);
});
console.log(12);
执行顺序解析
同步代码执行:
1.首先执行 console.log(1);,输出 1。
遇到 setTimeout,将其回调放入宏任务队列。
Promise.resolve().then() 把回调放入微任务队列。
new Promise 内部同步代码 console.log(10); 执行,输出 10,并将其 .then() 回调放入微任务队列。
执行 console.log(12);,输出 12。
2.微任务执行:
依次执行微任务队列中的回调,输出 6、11、9。在输出 6 时,内部 setTimeout 回调放入宏任务队列。
3.宏任务及后续微任务执行:
执行宏任务队列中的第一个 setTimeout 回调,输出 2,其内部 Promise.resolve().then() 回调放入微任务队列。
执行 Promise.resolve().then() 的第一个回调,输出 3,其内部 setTimeout 回调放入宏任务队列,接着执行第二个 .then() 回调,输出 5。
执行全局 Promise then 1 里 setTimeout 的回调,输出 7,其内部 Promise.resolve().then() 回调放入微任务队列并执行,输出 8。
执行前面 Promise then 1 里 setTimeout 的回调,输出 4。
最终输出顺序:1,10,12,6,11,9,2,3,5,7,8,4