首頁  >  文章  >  web前端  >  Promise.all() 的 Polyfill

Promise.all() 的 Polyfill

Linda Hamilton
Linda Hamilton原創
2024-10-22 20:43:02361瀏覽

Polyfills of Promise.all()

Promise.all() 函數

輸入:需要 Promise 陣列(不是必需的)
輸出:它會傳回 Promise,其中包含所有成功 Promise 的結果陣列。
注意:如果任何承諾失敗,則立即拒絕。

Promise.myAll() 的程式碼

`
Promise.myAll = 函數(承諾){
傳回新的 Promise(函數 (解決, 拒絕) {
// 檢查輸入是否為陣列
if (!Array.isArray(promises)) {
returnreject(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 都已解決,並且它們的結果儲存在 results 陣列中。
。當已解決的 Promise 數量等於輸入數組的長度時,外部 Promise 將使用結果數組進行解析。

2. 為什麼要使用Promise.resolve()

。在 Promise 陣列中,不一定所有值都必須是 Promise,它可以是任何值 - 數字、字串或任何同步函數。

  1. 如果傳遞的值已經是一個 Promise - 它將傳回相同的 Promise,確保不會發生額外的包裝或更改。

  2. 如果傳遞的值不是承諾 - 它將將該值包裝在已解決的承諾中,允許將其視為承諾並使用 .then()

  3. 處理它

3. 為什麼要使用 Promise.resolve(),為什麼不使用 Promise.reject()

這樣它就可以解析值,如果我們使用reject,它將被捕獲在catch區塊中,並且值被視為錯誤。

4. 如果任何 Promise 失敗會發生什麼事?

  1. 這會觸發外部promie的reject()調用,導致Promise.myAll()立即被拒絕。
  2. foreach 迴圈將繼續,因為它同步程式
  3. promise 的其餘部分將會解析,並且它的值會添加到結果中,但是作為completedPromise!=promises.length,它不會解析,如果仍然嘗試,它將被忽略,因為Promise.myAll()現在不處於待處理狀態。

如果還有任何疑問,請隨時在評論中提問!

以上是Promise.all() 的 Polyfill的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn