我仍在尝试弄清事件循环以及何时/何时处理任务队列。
console.log('start');
Promise.resolve().then(function() {
console.log('promise');
});
console.log('end');
这将输出以下内容:
> "start"
> "end"
> "promise"
promise是否会立即解决,因此调用堆栈在打印“ end”之前(在“ end”之前)将为空,因此回调将在“ end”打印之前作为任务处理?
我显然在这里缺少以下内容:a)将已解决的Promise回调添加到任务队列中,或b)在事件循环中处理任务时。
答案 0 :(得分:2)
使用您使用的术语。仅在平台代码正在运行时(即所有同步代码都已执行完毕),才执行任务队列。保证您的代码完全按照该顺序执行。
它们在事件循环之前(它们是“微任务”)运行在 之前,这就是为什么then
在任何setTimeout
之前执行的原因。
答案 1 :(得分:0)
问题在于,我认为在立即解决Promise之后,堆栈是透明的,但实际上,此时的堆栈不是 。您可以认为整个代码块的执行就像main()
程序的C
函数一样,类似于C
。
因此,由于堆栈不清晰,即使回调队列中的微任务正在等待处理,也要等到主线程中的所有同步JS代码完成后,它才会得到处理。