ホームページ > ウェブフロントエンド > jsチュートリアル > 非同期 JavaScript で、拒否されたものも含めてすべての Promise を処理するにはどうすればよいですか?

非同期 JavaScript で、拒否されたものも含めてすべての Promise を処理するにはどうすればよいですか?

DDD
リリース: 2024-12-16 12:36:12
オリジナル
334 人が閲覧しました

How Can I Handle All Promises, Including Rejected Ones, in Asynchronous JavaScript?

拒否にもかかわらず、すべての Promise が完了するのを待つ

非同期プログラミングでは、一部のタスクが失敗した場合に Promise を処理する際に課題が生じる可能性があります。次のシナリオを考えてみましょう:

const arr = [fetch('index.html'), fetch('http://does-not-exist')];

Promise.all(arr)
  .then(res => console.log('success', res))
  .catch(err => console.log('error', err)); // This is executed
ログイン後にコピー

上記のコードは、フェッチを使用してネットワーク リクエストを作成します。ただし、Promise.all は最初に失敗したリクエストを拒否するため、失敗したタスクを含むすべてのタスクの結果をどのように処理できるかという問題が発生します。

ネイティブ JavaScript ソリューション

この問題に対処するには、次のネイティブ JavaScript 手法を使用できます:

  1. reflect を使用したラッパーの作成Promise:
const reflect = p => p.then(v => ({ v, status: "fulfilled" }), e => ({ e, status: "rejected" }));
ログイン後にコピー

このリフレクト関数は、解決された値または拒否理由のいずれかを含むオブジェクトに解決される新しい Promise と、Promise の状態を示す status プロパティを返します。

  1. 全員に反映を適用Promises:
var arr = [fetch('index.html'), fetch('http://does-not-exist')];

Promise.all(arr.map(reflect)).then(function(results){
  var success = results.filter(x => x.status === "fulfilled");
});
ログイン後にコピー

この例では、配列内の各 Promise にリフレクトを適用します。結果の配列には、各リクエストのステータスとエラーまたは値のプロパティを持つオブジェクトが含まれるようになります。

最新の代替案: Promise.allSettled

最新のソリューションの場合は、組み込みの Promise.allSettled の使用を検討してください。 :

Promise.allSettled([promise]).then(([result]) => {
  // Code will execute regardless of the promise's state
  // { status: "fulfilled", value: 33 }
});
ログイン後にコピー

このメソッドは、その内容に関係なく、解決されたすべての Promise を処理する便利な方法を提供します。

これらのテクニックを活用すると、非同期操作を適切に管理し、失敗したものも含めすべての Promise の結果にアクセスできるため、利用可能なデータに基づいて情報に基づいた意思決定を行うことができます。

以上が非同期 JavaScript で、拒否されたものも含めてすべての Promise を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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