了解 Promise 链内部机制

问题描述 投票:0回答:1

我正在学习承诺链,我偶然发现了一个疑问。考虑下面的承诺链 -

const myPromise = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve("foo");
    }, 10000);
});

myPromise
    .then(handleFulfilledA, handleRejectedA)  // first then
    .then(handleFulfilledB, handleRejectedB)  // second then
    .then(handleFulfilledC, handleRejectedC); // third then

promise 构造函数返回一个promise 对象

myPromise
handleFulfilledA
handleRejectedA
附加到
[[PromiseFulfillReactions]]
对象的
[[PromiseRejectReactions]]
myPromise
。第二个和第三个
then
方法将在
myPromise
解析之前调用,因为
myPromise
需要 10 秒。

遇到第二个和第三个.then方法时内部会发生什么?

我试图找到答案,结果发现每个

then
方法都会返回一个新的
Promise
对象。我们称它们为
promiseB 
promiseC
handleFulfilledB
handleRejectedB
附加到
[[PromiseFulfillReactions]]
[[PromiseRejectReactions]]
promiseB
。同样,
handleFulfilledC
handleRejectedC
附加到
promiseC

但是如果是这种情况,当

myPromise
满足并且其
[[PromiseFulfillReactions]]
被执行时,其反应处理程序(
handleFulfilledA
handleRejectedA
)如何知道它必须解决或拒绝
promiseB
?处理程序如何知道它所传递到的
then
已经创建了一个
promiseB
的 Promise?换句话说,处理程序和新 Promise 之间的联系是如何建立的?”

javascript asynchronous ecmascript-6 es6-promise asynchronous-javascript
1个回答
0
投票

根据 then 方法的 MDN 文档

then() 返回一个新的 Promise 对象,但会改变 Promise 对象 它被调用,将处理程序附加到内部列表中。所以 处理程序由原始承诺保留,其生命周期为 至少与最初承诺的生命周期一样长。

这应该解释为什么链接是可能的。

© www.soinside.com 2019 - 2024. All rights reserved.