[解決済み] async/await関数を並列に呼び出す
質問
私の理解する限り、ES7/ES2016では、複数の
await
を連鎖させるのと同じように動作します。
.then()
はプロミスで、つまり、並列ではなく、1つずつ実行されます。例えば、こんなコードです。
await someCall();
await anotherCall();
というのは正しい理解でしょうか?
anotherCall()
が呼び出されるのは
someCall()
が完了したら?それらを並列に呼び出す最もエレガントな方法は何でしょうか?
Nodeで使いたいので、asyncライブラリで解決できるかも?
EDIT: 私はこの質問で提供された解決策に満足していません。 非同期ジェネレータにおけるプロミスの非並列待ちによる速度低下 なぜなら、それはジェネレーターを使用しており、私はより一般的な使用例について質問しているからです。
解決方法は?
で待機させることができます。
Promise.all()
:
await Promise.all([someCall(), anotherCall()]);
結果を保存するため。
let [someResult, anotherResult] = await Promise.all([someCall(), anotherCall()]);
なお
Promise.all
は高速に失敗します。つまり、それに供給された約束の1つが拒否されるとすぐに、それ全体が拒否されるのです。
const happy = (v, ms) => new Promise((resolve) => setTimeout(() => resolve(v), ms))
const sad = (v, ms) => new Promise((_, reject) => setTimeout(() => reject(v), ms))
Promise.all([happy('happy', 100), sad('sad', 50)])
.then(console.log).catch(console.log) // 'sad'
その代わりに、すべての約束が果たされるか拒否されるのを待ちたい場合は
Promise.allSettled
. ただし、Internet Explorerはこの方式をネイティブにサポートしていません。
const happy = (v, ms) => new Promise((resolve) => setTimeout(() => resolve(v), ms))
const sad = (v, ms) => new Promise((_, reject) => setTimeout(() => reject(v), ms))
Promise.allSettled([happy('happy', 100), sad('sad', 50)])
.then(console.log) // [{ "status":"fulfilled", "value":"happy" }, { "status":"rejected", "reason":"sad" }]
注 を使用する場合
Promise.all
拒絶が起こる前に終了することができたアクションはロールバックされないので、そのような状況に対処する必要があるかもしれません。例えば 5つのアクションがあり、4つがクイック、1つがスロー、そしてスローがリジェクトされたとします。この4つの はすでに実行されている可能性があるので、ロールバックが必要な場合があります。そのような場合はPromise.allSettled
どのアクションが失敗し、どのアクションが失敗しなかったかを正確に教えてくれるからです。
関連
-
jQueryのコピーオブジェクトの説明
-
[解決済み】TypeErrorの解決方法。未定義またはヌルをオブジェクトに変換できない
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] JavaScriptでsetIntervalの呼び出しを停止する
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] Reduxの非同期フローになぜミドルウェアが必要なのか?
-
[解決済み] アロー関数」と「ファンクション」は同じものですか?
-
[解決済み] async/await - タスクとvoidをいつ返すか?
-
[解決済み] Promise.allのエラー処理
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
Vue Element-uiは、アイコンを追加するためのツリーコントロールノードを詳細に実装しています。
-
要素ツリー制御によるvueTreeテーブル
-
Vueにシンプルなメモ帳機能を実装
-
Javascript Bootstrapのグリッドシステム、ナビゲーションバー、ローテーションの説明
-
[解決済み】Uncaught SyntaxError: JSONの位置0に予期しないトークンuがあります。
-
[解決済み】TypeError: Router.use() はミドルウェアの関数を要求しているが、Object を取得した。
-
[解決済み】Node.js Error: Cannot find module express
-
[解決済み】gulp anythingを実行するたびに、アサーションエラーが発生します。- タスク関数を指定する必要があります
-
[解決済み】ERROR エラーです。スイッチのname属性が指定されていないフォームコントロールの値アクセッサがない
-
[解決済み】<select>で現在選択されている<option>をJavaScriptで取得するにはどうすればよいですか?