繁体   English   中英

哪些微任务使用 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 的方法。 在“阅读” “Promise Resolve Functions”的 ECMA 规范之后,这就是我的理解:

Promise p2的执行器中的调用resolve(p2)将一个将p1链接到p2的微任务排入队列。 让我们称之为链接微任务

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

链接微任务调用p1then方法作为回调函数传递给p2resolvereject函数。 p1是一个已解析的 promise,因此对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”的任务。

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

我理解正确吗?

我理解正确吗?

是的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM