[英]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 处理微任务队列。 队列仅包含链接微任务。
链接微任务调用p1
的then
方法作为回调函数传递给p2
的resolve
和reject
函数。 p1
是一个已解析的 promise,因此对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”的任务。
微任务队列为空,程序退出。
我理解正确吗?
我理解正确吗?
是的。
但是,不要编写依赖于微任务顺序的代码。 这是为了跨 js 实现的确定性结果而详细指定的,而不是供用户代码依赖的。 它甚至可能随着 ECMAScript 版本而改变。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.