哪些微任务与 Promise 一起排队,并在 JavaScript 中用 Promise 解决?
What microtasks are enqueued with a Promise that resolves with a Promise in JavaScript?
我想了解当一个 Promise 被另一个 Promise 解决时,哪些微任务会被排入队列。
例如,使用以下代码入队的微任务是什么?
const p1 = Promise.resolve("A");
const p2 = new Promise(resolve => resolve(p1));
p2.then(() => console.log("THEN"));
我没有找到检查 V8 中的 MicrotaskQueue 的方法。
“阅读” ECMA specification of "Promise Resolve Functions" 之后,我的理解是:
Promise p2
的执行器中的调用 resolve(p2)
将链接 p1
到 p2
的微任务排入队列。让我们称它为 链接微任务.
代码块执行后,栈为空,V8处理微任务队列。该队列仅包含链接微任务。
链接微任务调用 p1
的 then
方法,将 p2
的 resolve
和 reject
函数作为回调函数传递。
p1
是一个已解决的承诺,因此对 then
的调用将一个新的微任务排入队列以执行 then 回调。让我们称之为 p1-then-p2 微任务.
微任务队列现在只包含 p1-then-p2 任务。
V8 执行 p1-then-p2 任务。该任务将一个新的微任务排入队列以执行代码中的最后一个 then
:p2.then(() => console.log("THEN"))
。让我们称之为 p2-then-console.
微任务队列现在只包含 p2-then-console 任务。
V8 执行在控制台打印“THEN”的任务。
微任务队列为空,程序退出。
我理解正确吗?
Do I understood correctly?
是的。
但是,不要编写依赖于微任务顺序的代码。这是为了跨 js 实现的确定性结果而详细指定的,而不是供用户代码依赖的。它甚至可能随着 ECMAScript 版本而改变。
我想了解当一个 Promise 被另一个 Promise 解决时,哪些微任务会被排入队列。
例如,使用以下代码入队的微任务是什么?
const p1 = Promise.resolve("A");
const p2 = new Promise(resolve => resolve(p1));
p2.then(() => console.log("THEN"));
我没有找到检查 V8 中的 MicrotaskQueue 的方法。 “阅读” ECMA specification of "Promise Resolve Functions" 之后,我的理解是:
Promise p2
的执行器中的调用 resolve(p2)
将链接 p1
到 p2
的微任务排入队列。让我们称它为 链接微任务.
代码块执行后,栈为空,V8处理微任务队列。该队列仅包含链接微任务。
链接微任务调用 p1
的 then
方法,将 p2
的 resolve
和 reject
函数作为回调函数传递。
p1
是一个已解决的承诺,因此对 then
的调用将一个新的微任务排入队列以执行 then 回调。让我们称之为 p1-then-p2 微任务.
微任务队列现在只包含 p1-then-p2 任务。
V8 执行 p1-then-p2 任务。该任务将一个新的微任务排入队列以执行代码中的最后一个 then
:p2.then(() => console.log("THEN"))
。让我们称之为 p2-then-console.
微任务队列现在只包含 p2-then-console 任务。 V8 执行在控制台打印“THEN”的任务。
微任务队列为空,程序退出。
我理解正确吗?
Do I understood correctly?
是的。
但是,不要编写依赖于微任务顺序的代码。这是为了跨 js 实现的确定性结果而详细指定的,而不是供用户代码依赖的。它甚至可能随着 ECMAScript 版本而改变。