Promise
.resolve()
.then(() => console.log(1))
.then(() => console.log(2))
.then(() => console.log(3));
Promise
.resolve()
.then(() => console.log(4))
.then(() => console.log(5))
.then(() => console.log(6));
答案:1 4 2 5 3 6
有人可以向我解释一下它如何工作吗?
为什么不执行1,2,3,4,5,6
?
A .then
回调在微任务中运行,仅在当前运行的同步代码完成后才运行。在此,同步代码使用Promise.resolve
初始化两个立即可解决的Promises。
微任务按顺序解析,因此在脚本末尾,队列中有两个微任务:放在队列中的第一个微任务是() => console.log(1)
,因此首先进行记录。此时,1
的Promise被解决,因此下一个.then
(2
)被放入微任务队列。放在队列中的第二个是() => console.log(4)
,因此第二个被记录,并且5
被放入微任务队列。然后2
运行并将其下一个.then
推送到队列(3),然后4
运行并将其下一个.then
(6
)推送到队列。等
// queue: [1, 4] // 1 gets logged // 2 gets pushed [4, 2] // 4 gets logged // 5 gets pushed [2, 5] // 2 gets logged // 3 gets pushed [5, 3] ...
如果您在等待第二个
Promise.resolve
之前一直等待第一个Promise的整个Promise链完全解决,那么它们都会按照您的期望按顺序运行:
(async () => {
await Promise
.resolve()
.then(() => console.log(1))
.then(() => console.log(2))
.then(() => console.log(3));
await Promise
.resolve()
.then(() => console.log(4))
.then(() => console.log(5))
.then(() => console.log(6));
})();