首頁  >  文章  >  web前端  >  如何在 JavaScript 中同步執行一系列 Promise?

如何在 JavaScript 中同步執行一系列 Promise?

DDD
DDD原創
2024-11-06 22:15:02239瀏覽

How to Synchronously Execute a Sequence of Promises in JavaScript?

如何同步 Promise 序列?

在這種情況下,我們有一個 Promise 物件數組,必須按照數組中指定的確切順序解析它們。此外,如果一個元素被拒絕,整個鏈應立即拒絕,從而防止進一步嘗試解析後續元素。

手動迭代

以下範例展示了順序執行 Promise 的手動迭代:

function processArray(array, fn) {
  var index = 0;

  function next() {
    if (index < array.length) {
      fn(array[index++]).then(next);
    }
  }
  return next();
}

這個函數接受一個陣列和一個承諾返回函數 fn 作為參數。它迭代數組,在每個元素上呼叫 fn 並將結果傳遞給下一次迭代。

將 .reduce() 與 Promise 結合使用

function processArray(array, fn) {
  return array.reduce((p, item) => {
    return p.then(() => {
      return fn(item).then((data) => {
        results.push(data);
        return results;
      });
    });
  }, Promise.resolve());
}

此方法使用 reduce() 方法累積一系列結果。數組中的每個項目都按順序處理,從 fn 返回的 Promise 用於推進迭代。

使用 Bluebird Promise 函式庫

Bluebird Promise 函式庫提供了處理非同步操作的便利方法,包括順序迭代。

Promise.mapSeries(arr, (item) => {
  // process each individual item here, return a promise
  return processItem(item);
}).then((results) => {
  // process final results here
}).catch((err) => {
  // process error here
});

Promise.mapSeries() 方法接受一個陣列和一個 Promise 產生函數,並傳回一個解析為解析結果陣列的 Promise。

使用ES7 async/await

使用ES7 async/await 語法,可以以更簡潔易讀的方式編寫順序非同步操作:

async function processArray(array, fn) {
  let results = [];
  for (let i = 0; i < array.length; i++) {
    let r = await fn(array[i]);
    results.push(r);
  }
  return results; // will be resolved value of promise
}

在此範例中,processArray 函數迭代數組,使用await暫停循環,直到從fn返回的每個promise都解決。

選擇正確的方法

同步一系列promise的最佳方法取決於諸如數量等因素數組中的元素、處理函數 fn 的複雜性以及所需的錯誤處理行為。對於較小的陣列和簡單的處理函數,手動迭代或使用 Bluebird 的 Promise.mapSeries() 可能就足夠了。對於更複雜的場景,使用 async/await 或最終答案中提供的自訂解決方案可能更合適。

以上是如何在 JavaScript 中同步執行一系列 Promise?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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