新承诺;考虑到情况有promiseA()
和promiseB(a)
取决于第一个结果,我想收集来自两个结果,并执行第三个动作doSomething(a, b)
:承诺嵌套vs链接风格
样式A(关闭/嵌套)
promiseA().then(function (resultA) {
return (promiseB(resultA).then(function (resultB) {
doSomething(resultA, resultB);
}));
});
样式B(返回值/链)
promiseA().then(function (resultA) {
return Promise.all([resultA, promiseB(resultA)]);
}).spread(function (resultA, resultB) {
doSomething(resultA, resultB);
});
据我所知,这些是等效的:
- 同测序约束
promiseA
和promiseB
- 之间的最终承诺的回报,如果
promiseA
或promiseB
被拒绝undefined
- 最终承诺被拒绝,或
doSomething
抛出。
作为样式,样式B减少缩进(末日金字塔)。
但是,样式B更难以重构。如果需要引入中间的promiseA2(a)
和doSomething(a, a2, b)
,我需要修改3行(Promise.all
,spread
, doSomething
),这可能会导致错误(意外交换等),而样式AI仅用于修改1行(doSomething
)和变量名称说明它是哪个结果。在大型项目中,这可能很重要。
这两种风格之间是否存在其他非功能性权衡?更多/更少的内存分配在一个和另一个之间?更多/更少转向事件循环?例外的更好/更糟糕的堆栈跟踪?
'const resultA = await promiseA(); const resultB =等待promiseB(resultA); doSomething(resultA,resultB);' – zerkms
另请参阅[如何访问'.then()'链中的先前承诺结果?](http://stackoverflow.com/q/28250680/1048572)不同的方法 – Bergi