Promise链式调用内部机制:handler与新Promise的关联疑问
Promise链式调用中处理函数与新Promise的关联机制
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
你疑惑的核心点在于:自己定义的handleFulfilledA明明和promiseB没有直接关联,它怎么能控制promiseB的状态?其实关键在于**then方法会对我们传入的处理函数做一层隐形包装**,而非直接把我们的函数挂到原Promise的回调队列里。
具体拆解执行逻辑:
- 当调用第一个
then(handleFulfilledA, handleRejectedA)时,JS引擎会:- 立刻创建全新的Promise实例(即你说的
promiseB)。 - 生成一个内部代理回调函数,这个函数会持有
promiseB的resolve和reject方法。 - 将这个内部代理函数添加到
myPromise的[[PromiseFulfillReactions]]队列中(而非直接添加handleFulfilledA)。
- 立刻创建全新的Promise实例(即你说的
- 10秒后
myPromise被resolve,触发队列中的内部代理函数执行:- 代理函数先调用我们定义的
handleFulfilledA("foo"),获取它的返回值(或捕获抛出的错误)。 - 如果
handleFulfilledA正常返回,代理函数就调用promiseB.resolve(返回值),将promiseB的状态改为fulfilled;如果handleFulfilledA抛出错误,则调用promiseB.reject(错误对象),将promiseB改为rejected。
- 代理函数先调用我们定义的
- 第二个
then(handleFulfilledB, handleRejectedB)的逻辑完全一致:它创建promiseC,生成代理函数挂到promiseB的回调队列中,等promiseB状态变化时,代理函数调用handleFulfilledB,再控制promiseC的状态。
简言之:我们写的handleFulfilledA本身并不知道promiseB的存在,是then方法生成的“中间代理”在两者之间搭建了关联——代理函数一边接收原Promise的结果,一边用这个结果驱动新Promise的状态变化。
内容的提问来源于stack exchange,提问作者Arman Lalani
相关产品推荐
相关产品推荐

