ホームページ > ウェブフロントエンド > jsチュートリアル > Promise.allSettled() は必要ですか?

Promise.allSettled() は必要ですか?

DDD
リリース: 2024-11-30 16:47:14
オリジナル
695 人が閲覧しました

Do we need Promise.allSettled()?

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 サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート