Promise嵌套与链式写法的差异、返回值及适用场景分析
问题解答
一、两种写法除可读性外的核心区别
- 作用域访问能力不同:嵌套写法中,内层
then的回调可以直接访问所有上层任务的返回值,比如job的返回结果可以在job2、job3、job4乃至doSomething的回调中直接拿到;而链式写法每个then的回调默认只能获取上一个then的返回值,要用到更早任务的结果需要额外定义外层变量存储,或者每次then都把需要的值透传返回,使用成本更高。 - 出错概率不同:嵌套写法很容易出现漏写
return的问题,导致原本需要串行执行的异步任务变成并行,触发逻辑bug;链式写法的扁平结构天然要求每个then返回下一个任务,漏写的概率更低。 - 错误处理的灵活度不同:嵌套写法可以给任意层的异步任务单独绑定
catch,实现内层错误局部处理不中断外层流程;链式写法默认所有错误都会一路向后冒泡到末尾的catch,如果要实现局部错误处理需要给单个then单独传入错误回调,写法更繁琐。 - 内存占用不同:嵌套写法所有内层回调都会持有上层作用域的引用,整个Promise链执行完成前,所有上层作用域的变量都无法被垃圾回收;链式写法每个
then的回调执行完成后,对应作用域如果没有被外部引用就会被回收,内存开销更低。
二、两种实现中test()的返回值
两种写法的test()返回值完全一致,都是Promise实例:
- 若
job、job2、job3、job4全部执行成功,且doSomething执行无报错,该Promise最终会兑现为doSomething的返回值(如果doSomething没有返回值则为undefined) - 若任意一个
job执行失败、或者doSomething抛出同步错误,该Promise会直接以对应的错误理由进入拒斥状态
三、doSomething是重异步操作时的选型
优先选链式写法,原因如下:
- 嵌套写法层级越深越难维护,后续要新增异步步骤、调整执行顺序的成本极高,很容易出现漏写
return导致异步顺序错乱的问题 - 链式写法内存占用更低,不会长时间持有多余的上层作用域引用,对资源消耗高的重异步操作更友好
- 错误处理更直观,末尾加一个统一的
catch就能捕获全链路的错误,排查问题更方便
内容的提问来源于stack exchange,提问作者alchemist95
相关产品推荐
相关产品推荐

