[解決済み] .then()チェーンで以前のプロミス結果にアクセスするにはどうすればよいですか?
質問
私は、コードを
約束
を構築し、素晴らしい長さの
フラットプロミスチェーン
で構成され、複数の
.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?
});
}
解決方法は?
ECMAScriptのハーモニー
もちろん、この問題は言語設計者にも認識されていました。彼らは多くの作業を行い 非同期関数の提案 にやっと入った。
ECMAScript 8
は1つも必要ありません。
then
非同期関数(呼び出されたときにプロミスを返す)では、プロミスが直接解決するのを待つだけなので、呼び出しやコールバック関数はもう必要ありません。また、条件、ループ、try-catch-clauseなどの任意の制御構造も備えていますが、ここでは便宜上不要とします。
async function getExample() {
var resultA = await promiseA(…);
// some processing
var resultB = await promiseB(…);
// more processing
return // something using both resultA and resultB
}
ECMAScript 6
ES8を待っている間、私たちはすでに非常によく似た構文を使っていました。ES6では
ジェネレータ関数
これは、実行を任意の位置の
yield
というキーワードがあります。これらのスライスは互いに独立して、非同期にも実行できます。これはちょうど、次のステップを実行する前にプロミスの解決を待ちたいときに行うことです。
専用のライブラリ(例えば co または task.js ) だけでなく、多くのプロミス・ライブラリは、ヘルパー関数 ( Q , ブルーバード , いつ を行う、...) この非同期ステップバイステップ実行 プロミスを生成するジェネレータ関数を渡すと、あなたのために。
var getExample = Promise.coroutine(function* () {
// ^^^^^^^^^^^^^^^^^ Bluebird syntax
var resultA = yield promiseA(…);
// some processing
var resultB = yield promiseB(…);
// more processing
return // something using both resultA and resultB
});
これはNode.jsではバージョン4.0から動作しており、いくつかのブラウザ(またはその開発版)は比較的早くからジェネレータ構文をサポートしていました。
ECMAScript 5
しかし、後方互換性を確保したいのであれば、トランスパイラを使用しないと、それらを使用することはできません。ジェネレータ関数と非同期関数の両方は、現在のツールでサポートされています。 ジェネレータ と 非同期関数 .
そして、その他にも多くの
コンパイル可能なJS言語
は、非同期プログラミングを容易にすることに特化しています。これらは通常、以下のような構文を使用します。
await
を使用します(例.
アイスコーヒースクリプト
) がありますが、その他にもHaskellのような
do
-のような記法があります(例.
ラテJs
,
単項目
,
ピュアスクリプト
または
LispyScript
).
関連
-
[解決済み】FirefoxでGoogle Maps V3をリモートで使用すると「googleが定義されていません」と表示される。
-
[解決済み】'useState' が定義されていない no-undef React
-
[解決済み] Access-Control-Allow-Originヘッダーはどのように機能するのですか?
-
[解決済み] コールバック内で正しい `this` にアクセスする方法
-
[解決済み] JavaScriptの正規表現でマッチしたグループにアクセスするにはどうすればよいですか?
-
[解決済み] 明示的なプロミス構築のアンチパターンとそれを回避する方法とは?
-
[解決済み] オブジェクトがPromiseであるかどうかを判断するにはどうすればよいですか?
-
[解決済み】プロミスの値にアクセスする方法は?
-
[解決済み] Angular HttpPromise: `success`/`error` メソッドと `then` の引数の違い。
-
[解決済み] プロミスチェインで複数のキャッチを処理する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】フォームコントロールの値アクセサがない
-
[解決済み】webpack: モジュールが見つかりません。Error: 解決できない(相対パスで)
-
[解決済み】JavaScriptのinnerHTMLで要素が更新されない
-
[解決済み】「Uncaught TypeError: Chromeで "Illegal invocation "が発生する。
-
[解決済み】BootstrapのCollapseが折りたたまれない
-
[解決済み】Redux TypeError: 未定義のプロパティ 'apply' を読み取れない
-
[解決済み】JavaScriptで相対URLへのリダイレクトを行う
-
[解決済み】TypeError: res.status は関数ではありません。
-
[解決済み】TypeError:res.jsonは関数ではありません。
-
[解決済み】未定義のプロパティ 'forEach' を読み取ることができない