已解决的承诺需要多长时间才能进入任务队列?



我仍在尝试弄清楚事件循环以及何时处理任务队列

console.log('start');
Promise.resolve().then(function() {
console.log('promise');
});
console.log('end');

这将输出以下内容:

> "start"
> "end"
> "promise"

承诺不应该立即解决,因此调用堆栈将在(打印"结束"之前(为空,因此回调将在打印"结束"之前作为任务处理?

我在这里显然缺少一些关于 a( 何时将已解决的 Promise 回调添加到任务队列或 b( 何时在事件循环中处理任务的内容。

使用您使用的术语。任务队列在仅运行平台代码时执行 - 即当所有同步代码都已完成执行时。您的代码保证完全按照该顺序执行。

它们在事件循环之前运行(它们是"微任务"(,这就是为什么您的then在任何setTimeout之前执行的原因。

问题是我认为在立即解决 Promise 之后堆栈是清晰的,但实际上堆栈在这一点上并不清楚。你可以把整个代码块的执行看作是一个C程序的main()函数,以做一个C类比。

因此,由于堆栈不清楚,即使现在在回调队列中等待处理的微任务,也要等到主线程中的所有同步 JS 代码完成后才会被处理。

最新更新