哪些微任务与 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) 将链接 p1p2 的微任务排入队列。让我们称它为 链接微任务.

代码块执行后,栈为空,V8处理微任务队列。该队列仅包含链接微任务。

链接微任务调用 p1then 方法,将 p2resolvereject 函数作为回调函数传递。 p1 是一个已解决的承诺,因此对 then 的调用将一个新的微任务排入队列以执行 then 回调。让我们称之为 p1-then-p2 微任务.

微任务队列现在只包含 p1-then-p2 任务。

V8 执行 p1-then-p2 任务。该任务将一个新的微任务排入队列以执行代码中的最后一个 thenp2.then(() => console.log("THEN"))。让我们称之为 p2-then-console.

微任务队列现在只包含 p2-then-console 任务。 V8 执行在控制台打印“THEN”的任务。

微任务队列为空,程序退出。

我理解正确吗?

Do I understood correctly?

是的。

但是,不要编写依赖于微任务顺序的代码。这是为了跨 js 实现的确定性结果而详细指定的,而不是供用户代码依赖的。它甚至可能随着 ECMAScript 版本而改变。