Promise.allSettled() についてどう思われますか?
私にとって、allSettled は問題を探すための解決策のように見えます。その問題は、開発者がエラーを処理していないことです。
Promise.allSettled() の設計は非常にシンプルです:
const allSettled = (promises) => Promise.all(promises.map(entry => entry .then((value) => ({ status: 'fulfilled', value })) .catch((reason) => ({ status: 'rejected', reason })) ));
これは「一貫した」結果オブジェクトを提供します。ステータスは一貫しているため、Object.hasOwn() を使用するよりもよりクリーンに .filter() を実行できますが、値と理由は意図的に異なるため、混同することはできません。
ほとんどの場合、allSettled は各 Promise に .catch() を追加します。
しかし、ここが私のこだわりです。サービスのグループを並行して呼び出していて、1 つまたは複数のサービスが失敗する可能性があることがわかっているのに、それは実際には問題ではない場合...なぜそのためのエラー処理を書かないのですか?
const getFlakyService = (payload) => fetch(flakyUrl, payload); Promise.allSettled([ getFlakyService({ type: 'reptiles' }), getFlakyService({ type: 'mammals' }), getFlakyService({ type: 'birds' }), getFlakyService({ type: 'amphibians' }), ]).then((outcomes) => outcomes .filter(({ status }) => status === 'fulfilled')) });
これと比較してどれだけの労力を節約できるか:
const getFlakyService = (payload) => fetch(flakyUrl, payload) // We don't really care about the failures .catch(() => undefined); Promise.all([ getFlakyService({ type: 'reptiles' }), getFlakyService({ type: 'mammals' }), getFlakyService({ type: 'birds' }), getFlakyService({ type: 'amphibians' }), ]).then((data) => { /* ... */ });
どの呼び出しが失敗しているかを気にする場合は、追跡のためにアクセスできるリクエスト情報が必要になる可能性がありますが、その理由でリクエスト情報が利用できるとは限りません。この場合、Promise.allSettled はさらに役に立たず、独自のエラー処理を作成する方が合理的です。
const getFlakyService = (payload) => fetch(flakyUrl, payload) // Send the failures details to a tracking/logging layer .catch((error) => trackRequestError(flakyUrl, payload, error); Promise.all([ getFlakyService({ type: 'reptiles' }), getFlakyService({ type: 'mammals' }), getFlakyService({ type: 'birds' }), getFlakyService({ type: 'amphibians' }), ]).then((data) => { /* ... */ });
「結果」の標準化が便利であることは認めます。 allSettled を使用すると、すべてが完了した後で失敗をカウントできます。しかし、これはカスタム エラー処理にも当てはまります。
私は近い将来も Promise.all() を使い続けるつもりですが、Promise.allSettled() の使用例と、それを好む理由について知りたいと思っています。
以上がPromise.allSettled() は必要ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。