私はコードを再構築して約束、そして複数のコールバックで構成される、長くてフラットなすばらしいプロミス チェーン.then()
を構築しました。最終的には、何らかの複合値を返し、複数の中間プロミス結果にアクセスする必要があります。ただし、シーケンスの途中からの解決値は最後のコールバックの範囲内にありません。どうすればアクセスできますか?
function getExample() {
return promiseA(…).then(function(resultA) {
// Some processing
return promiseB(…);
}).then(function(resultB) {
// More processing
return // How do I gain access to resultA here?
});
}
ベストアンサー1
連鎖を断ち切る
チェーン内の中間値にアクセスする必要がある場合は、チェーンを必要な部分に分割する必要があります。1つのコールバックをアタッチしてそのパラメータを複数回使用するのではなく、結果値が必要な場所に複数のコールバックを同じプロミスにアタッチします。約束は将来の価値を表す(代理する)だけである! 線形チェーンで 1 つのプロミスを他のプロミスから派生させた後、ライブラリによって提供されるプロミス コンビネータを使用して結果値を構築します。
これにより、制御フローが非常に簡単になり、機能の構成が明確になり、モジュール化が容易になります。
function getExample() {
var a = promiseA(…);
var b = a.then(function(resultA) {
// some processing
return promiseB(…);
});
return Promise.all([a, b]).then(function([resultA, resultB]) {
// more processing
return // something using both resultA and resultB
});
}
ES6 以降でのみ利用可能になったコールバック内のパラメータ分解の代わりにPromise.all
、ES5 では、then
多くの Promise ライブラリによって提供される気の利いたヘルパー メソッドによって呼び出しが置き換えられます (質問、青い鳥、いつ、…): .spread(function(resultA, resultB) { …
。
ブルーバードには専用のjoin
関数Promise.all
その+spread
の組み合わせをより単純な(そしてより効率的な)構造に置き換えます。
…
return Promise.join(a, b, function(resultA, resultB) { … });