在這種情況下,我們有一個 Promise 物件數組,必須按照數組中指定的確切順序解析它們。此外,如果一個元素被拒絕,整個鏈應立即拒絕,從而防止進一步嘗試解析後續元素。
以下範例展示了順序執行 Promise 的手動迭代:
function processArray(array, fn) { var index = 0; function next() { if (index < array.length) { fn(array[index++]).then(next); } } return next(); }
這個函數接受一個陣列和一個承諾返回函數 fn 作為參數。它迭代數組,在每個元素上呼叫 fn 並將結果傳遞給下一次迭代。
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 函式庫提供了處理非同步操作的便利方法,包括順序迭代。
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 語法,可以以更簡潔易讀的方式編寫順序非同步操作:
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中文網其他相關文章!