我试图了解什么是微任务排队时,一个承诺是解决与另一个承诺。
例如,哪些微任务是用以下代码排队的?
const p1 = Promise.resolve("A");
const p2 = new Promise(resolve => resolve(p1));
p2.then(() => console.log("THEN"));我没有办法检查MicrotaskQueue在V8。在“阅读”了ECMA“承诺解析函数”规范之后,这就是我所理解的:
承诺的执行者中的调用resolve(p2)将一个将p1链接到p2的微任务排队。让我们称它为链微任务。
执行代码块后,堆栈为空,V8处理微任务队列。队列只包含链接微任务。
链接微任务调用p1的p1方法,作为回调函数传递p2的resolve和reject函数。p1是一个已解决的承诺,因此对then的调用将排队一个新的微任务来执行随后的回调。让我们称它为p1-然后-p2微任务。
微任务队列现在只包含p1-然后-p2任务。
V8执行p1-然后-p2任务。该任务排队一个新的微任务,以执行代码中的最后一个then:p2.then(() => console.log("THEN"))。让我们称它为p2-then-console.
微任务队列现在只包含p2-然后控制台任务。V8在控制台中执行“然后”的任务打印。
微任务队列为空,程序退出。
我的理解正确吗?
发布于 2022-03-30 00:07:39
我的理解正确吗?
是。
但是,不要编写将取决于微任务顺序的代码。这是针对跨js实现的确定性结果详细指定的,而不是用户代码所依赖的。它甚至可能随着ECMAScript版本的变化而改变。
https://stackoverflow.com/questions/71668332
复制相似问题