.then() チェーンで以前の Promise 結果にアクセスするにはどうすればいいですか? 質問する

.then() チェーンで以前の Promise 結果にアクセスするにはどうすればいいですか? 質問する

私はコードを再構築して約束、そして複数のコールバックで構成される、長くてフラットなすばらしいプロミス チェーン.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) { … });

おすすめ記事