私の理解する限りでは、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.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
どのアクションが失敗し、どのアクションが失敗しなかったかの正確な詳細を提供する while の使用を検討してください。