我正在学习承诺链,我偶然发现了一个疑问。考虑下面的承诺链 -
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 之间的联系是如何建立的?”
根据 then 方法的 MDN 文档:
then() 返回一个新的 Promise 对象,但会改变 Promise 对象 它被调用,将处理程序附加到内部列表中。所以 处理程序由原始承诺保留,其生命周期为 至少与最初承诺的生命周期一样长。
这应该解释为什么链接是可能的。