非同期プログラミングでは、一部のタスクが失敗した場合に 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 手法を使用できます:
const reflect = p => p.then(v => ({ v, status: "fulfilled" }), e => ({ e, status: "rejected" }));
このリフレクト関数は、解決された値または拒否理由のいずれかを含むオブジェクトに解決される新しい Promise と、Promise の状態を示す status プロパティを返します。
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]).then(([result]) => { // Code will execute regardless of the promise's state // { status: "fulfilled", value: 33 } });
このメソッドは、その内容に関係なく、解決されたすべての Promise を処理する便利な方法を提供します。
これらのテクニックを活用すると、非同期操作を適切に管理し、失敗したものも含めすべての Promise の結果にアクセスできるため、利用可能なデータに基づいて情報に基づいた意思決定を行うことができます。
以上が非同期 JavaScript で、拒否されたものも含めてすべての Promise を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。