async/await関数を並列に呼び出す 質問する

async/await関数を並列に呼び出す 質問する

私の理解する限りでは、ES7/ES2016 では、awaitコード内に複数の ' を配置する.then()と、Promise によるチェーンと同様に動作し、並列ではなく順番に実行されます。たとえば、次のコードがあるとします。

await someCall();
await anotherCall();

anotherCall()が完了したときにのみ呼び出されると正しく理解していますかsomeCall()? これらを並行して呼び出す最もエレガントな方法は何ですか?

Node で使用したいのですが、非同期ライブラリを使用した解決策があるでしょうか?

編集: この質問で提供されている解決策には満足していません:非同期ジェネレーターでの Promise の非並列待機による速度低下ジェネレータを使用するので、より一般的な使用例について質問しているからです。

ベストアンサー1

お待ちいただけますPromise.all():

await Promise.all([someCall(), anotherCall()]);

結果を保存するには:

let [someResult, anotherResult] = await Promise.all([someCall(), anotherCall()]);

すぐに失敗することに注意してくださいPromise.all。つまり、提供された Promise の 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.allSettledInternet 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どのアクションが失敗し、どのアクションが失敗しなかったかの正確な詳細を提供する while の使用を検討してください。

おすすめ記事