我仍在尝试弄清楚事件循环以及何时处理任务队列
。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 代码完成后才会被处理。