新承諾;考慮到情況有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