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

时间:2018-08-25 16:31:40

标签: javascript asynchronous promise task-queue event-loop

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

console.log('start');

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

console.log('end');

这将输出以下内容:

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

promise是否会立即解决,因此调用堆栈在打印“ end”之前(在“ end”之前)将为空,因此回调将在“ end”打印之前作为任务处理?

我显然在这里缺少以下内容:a)将已解决的Promise回调添加到任务队列中,或b)在事件循环中处理任务时。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

问题在于,我认为在立即解决Promise之后,堆栈是透明的,但实际上,此时的堆栈不是 。您可以认为整个代码块的执行就像main()程序的C函数一样,类似于C

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