已解决的 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代码完成后才处理。
我仍在尝试弄清楚事件循环以及 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代码完成后才处理。