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

How long do resolved Promises take to enter the task queue?

我仍在尝试弄清楚事件循环以及 tick/when 任务队列处理的确切时间。

console.log('start');

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

console.log('end');

这会输出以下内容:

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

promise 不应该立即解决,因此调用堆栈将在之后(在打印 "end" 之前)立即为空,因此回调将在 "end" 之前作为任务处理印刷?

我在这里显然遗漏了一些关于 a) 当已解决的 Promise 回调被添加到任务队列时或 b) 当任务在事件循环中被处理时。

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

它们 运行 事件循环之前(它们是 "microtasks"),这就是为什么你的 then 在任何 setTimeout 例如。

问题是我认为在立即解决 Promise 之后堆栈是清晰的,但实际上堆栈在那个时候 不是 清晰。您可以将正在执行的整个代码块视为 C 程序的 main() 函数来进行 C 类比。

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