printAbstraction() 在这段自定义Promise代码中是如何执行的?
解答:squareAreaPromise的fulfil调用逻辑解析
你要找的squareAreaPromise的fulfil调用,藏在sidePromise被fulfil后触发的依赖回调里,通过嵌套的depend调用完成。下面一步步拆解执行流程:
1. 初始化阶段:绑定依赖
当执行var squareAreaPromise = depend(sidePromise, squareAreaAbstraction)时:
sidePromise此时处于pending状态,进入depend函数的if分支- 向
sidePromise.dependencies中推入一个匿名回调函数,核心逻辑如下:
这里的function(value) { depend(expression(value), function(newValue) { fulfil(result, newValue); // 这里的`result`就是最终的squareAreaPromise return createPromise(); }) }result是depend函数开头创建的空promise,也就是最终返回的squareAreaPromise。
2. 触发sidePromise的fulfil
执行fulfil(sidePromise, 10)时:
sidePromise状态变为fulfilled,值设为10- 遍历
sidePromise.dependencies中的回调,执行刚才推入的匿名函数,传入参数value=10
3. 执行squareAreaAbstraction并触发squareAreaPromise的fulfil
在匿名回调函数内部:
- 调用
expression(value)即squareAreaAbstraction(10),这个函数内部:- 创建新promise,立刻调用
fulfil(result, 10*10=100),返回这个已fulfilled的promise
- 创建新promise,立刻调用
- 接着调用
depend(这个已fulfilled的promise, 匿名函数):- 因为传入的promise状态是
fulfilled,进入depend函数的else分支 - 执行
expression(promise.value)即匿名函数function(newValue) { fulfil(result, newValue); ... },传入newValue=100 - 此时执行
fulfil(result, 100),这里的result就是最开始depend返回的squareAreaPromise——这就是你要找的调用点!
- 因为传入的promise状态是
4. 后续printPromise的触发逻辑同理
squareAreaPromise被fulfil后,会触发它自己的依赖回调(创建printPromise时绑定的),进而执行printAbstraction(100),最终完成console.log的调用。
补充:关于depend里返回空promise的原因
代码里嵌套的depend调用最后返回createPromise(),是因为depend函数要求必须返回一个promise,但这里的匿名函数只是用来触发目标promise的fulfil,不需要实际传递值,所以返回一个空的pending promise即可,不影响流程。
内容的提问来源于stack exchange,提问作者Saurav Singh
相关产品推荐
相关产品推荐

