Promise.all() のポリフィル

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-22 20:43:02446ブラウズ

Polyfills of Promise.all()

Promise.all()の関数

入力: Promise の配列を受け取ります (必須ではありません)
出力: すべての成功 Promise の結果の配列を含む Promise を返します。
注: Promise が失敗すると、即座に拒否されます。

Promise.myAll() のコード

`
Promise.myAll = 関数 (約束) {
return new Promise(関数 (解決、拒否) {
// 入力が配列かどうかを確認します
if (!Array.isArray(promises)) {
return replace(new TypeError("引数は配列である必要があります"));
}

let results = [];
let completedPromises = 0;

promises.forEach(function (promise, index) {
  // Use Promise.resolve to handle non-promise values
  Promise.resolve(promise)
    .then(function (value) {
      results[index] = value;
      completedPromises += 1;

      // If all promises are resolved
      if (completedPromises === promises.length) {
        resolve(results);
      }
    })
    .catch(function (error) {
      reject(error); // Reject if any promise fails
    });
});

// Handle case with empty array of promises
if (promises.length === 0) {
  resolve([]);
}

});
};
`

1. すべての約束が正常に解決された場合

。すべての Promise が解決され、その結果は結果配列に保存されます。
。解決された Promise の数が入力配列の長さと等しい場合、外側の Promise は結果の配列で解決されます。

2. Promise.resolve() を使用する理由

。 Promise の配列では、すべての値が Promise である必要はありません。数値、文字列、または任意の同期関数など、任意の値を使用できます。

  1. 渡された値がすでに Promise である場合 - 余分なラッピングや変更が発生しないように、同じ Promise を返します。

  2. 渡された値が Promise ではない場合 - 解決された Promise で値をラップし、Promise のように扱い、.then()

  3. で処理できるようにします。

3. なぜ Promise.resolve() で、なぜ Promise.reject() ではないのか

値で解決できるように、reject を使用すると、値がエラーとみなされ、catch ブロックに捕捉されます。

4. Promise が失敗した場合はどうなりますか?

  1. これにより、外側のプロミーのreject()呼び出しがトリガーされ、Promise.myAll()が即座に拒否されます。
  2. foreach ループは同期プログラムとして続行されます
  3. Promise の残りの部分は解決され、その値が結果に追加されますが、completedPromise!=promises.length であるため解決されず、まだ試行しても Promise.myAll() が保留状態ではないため無視されます。

ご不明な点がございましたら、お気軽にコメント欄にてお問い合わせください。

以上がPromise.all() のポリフィルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。