JavaScript では、複数の非同期操作の操作を容易にするために、ES2020 で Promise.allSettled が導入されました。 Promise が拒否されたときにショートする Promise.all とは異なり、Promise.allSettled は、成功か失敗かにかかわらず、すべての Promise から結果を確実に取得します。
このチュートリアルでは、Promise.allSettled を最初から構築することに重点を置き、独自の実装を作成する手順を説明します。また、Promise がバックグラウンドでどのように機能するかについても説明し、JavaScript を非常に強力にする非同期動作を理解するのに役立ちます。
コードの作成に入る前に、Promise.allSettled の機能を詳しく見てみましょう。
配列内の各オブジェクトには以下が含まれます:
const promises = [ Promise.resolve('Success'), Promise.reject('Failure'), Promise.resolve('Complete') ]; Promise.allSettled(promises).then(results => { console.log(results); });
出力:
[ { status: 'fulfilled', value: 'Success' }, { status: 'rejected', reason: 'Failure' }, { status: 'fulfilled', value: 'Complete' } ]
この方法は、成功したか失敗したかに関係なく、すべての Promise が完了するまで待つ必要がある場合に最適です。
この機能は最新のブラウザーで利用できるようになりましたが、自分で実装すると、JavaScript がどのように機能するかをより深く理解できます。さらに、ES2020 機能をネイティブにサポートしていない古い環境との互換性も保証します。
Promise.allSettled の動作を模倣する allSettled という名前の関数を作成します。これを段階的に構築してみましょう:
関数は Promise の配列を受け取り、新しい Promise を返します。この新しい Promise は、すべての入力 Promise が解決されると解決されます (解決または拒否のいずれか)。
function allSettled(promises) { // This will return a new promise that resolves when all promises settle return new Promise((resolve) => { // Implementation goes here }); }
配列内の各 Promise について、それが解決されるか拒否されるかを追跡する必要があります。各 Promise を .then() と .catch() でラップしてステータスをキャプチャします。
function allSettled(promises) { return new Promise((resolve) => { let results = []; let count = 0; promises.forEach((promise, index) => { // Wrap the promise with a .then() and .catch() to capture the result promise .then((value) => { results[index] = { status: 'fulfilled', value }; }) .catch((reason) => { results[index] = { status: 'rejected', reason }; }) .finally(() => { count++; // Once all promises have settled, resolve the outer promise if (count === promises.length) { resolve(results); } }); }); }); }
1.外側の Promise の作成:
allSettled 関数は新しい Promise を返します。この Promise は、すべての入力 Promise が解決されたときに解決されます。
2. Promise のループ:
.forEach を使用して、Promise 配列をループします。各 Promise について、.then() (解決された Promise の場合) と .catch() (拒否された Promise の場合) を使用してその結果を追跡します。
3.記録結果:
各 Promise の結果は結果配列に保存されます。 Promise が解決されると、オブジェクトには { status: 'fulfilled', value } が含まれます。拒否した場合は、{ status: 'rejected',reason } を保存します。
4.解決済みの約束を数える:
カウント変数を使用して、決済された約束の数を追跡します。 Promise が (.then() または .catch() を通じて) 終了するたびに、カウントが増加します。 count が入力配列の長さと等しくなったら、結果の配列を使用して外側の Promise を解決します。
それでは、このカスタム実装をテストしてみましょう:
const promises = [ Promise.resolve('Success'), Promise.reject('Failure'), Promise.resolve('Complete') ]; Promise.allSettled(promises).then(results => { console.log(results); });
出力:
[ { status: 'fulfilled', value: 'Success' }, { status: 'rejected', reason: 'Failure' }, { status: 'fulfilled', value: 'Complete' } ]
予想どおり、この関数はすべての Promise が解決するまで待機し、結果の配列により、解決されたか拒否されたかなど、各 Promise に関する詳細情報が得られます。
理解を深めるために、Promise がどのように機能するかを詳しく見てみましょう。
操作が正常に完了すると解決 (実行) されます。
操作が失敗した場合は拒否されます。
履行または拒否された場合に決済されます
then() メソッドを使用すると、Promise が解決されたときに実行される関数を指定でき、catch() メソッドを使用すると拒否を処理できます。 Final() を使用すると、Promise の解決 (成功または失敗) が重複せずに確実に処理されます。
Promise.allSettled を実装することは、Promise が基本的なレベルでどのように機能するかを理解するための素晴らしい方法です。重要な点は、拒否に遭遇すると停止する Promise.all とは異なり、Promise.allSettled はすべての Promise が完了するまで待機するということです。
これを最初から実装することで、複数の非同期操作をクリーンかつ効率的な方法で処理する方法も学びました。この知識を使用して、最新の機能をネイティブにサポートしていない環境を含む、任意の JavaScript 環境で Promise を操作できるようになりました。
以上がチュートリアル: JavaScript でポリフィル Promise.allSettled を最初から実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。