首頁 >web前端 >js教程 >如何在非同步 JavaScript 中處理所有 Promise,包括被拒絕的 Promise?

如何在非同步 JavaScript 中處理所有 Promise,包括被拒絕的 Promise?

DDD
DDD原創
2024-12-16 12:36:12337瀏覽

How Can I Handle All Promises, Including Rejected Ones, in Asynchronous JavaScript?

儘管遭到拒絕,仍等待所有 Promise 完成

在非同步程式設計中,當某些任務失敗時,處理 Promise 可能會帶來挑戰。讓我們考慮以下場景:

const arr = [fetch('index.html'), fetch('http://does-not-exist')];

Promise.all(arr)
  .then(res => console.log('success', res))
  .catch(err => console.log('error', err)); // This is executed

上面的程式碼使用 fetch 發出網路請求。然而,由於 Promise.all 會在第一個失敗的請求時拒絕,我們遇到了一個問題:我們如何處理所有任務的結果,甚至是那些失敗的任務?

原生JavaScript 解決方案

To為了解決這個問題,我們可以採用以下原生JavaScript 技術:

  1. 使用Reflect 建立Wrapper Promise:
  2. 使用Reflect 建立Wrapper Promise:
const reflect = p => p.then(v => ({ v, status: "fulfilled" }), e => ({ e, status: "rejected" }));

    此反射函數傳回一個新的Promise,此 Promise 解析為包含解析值或拒絕原因的對象,以及指示 Promise 狀態的狀態屬性。
  1. 將Reflect 應用於所有Promises:
var arr = [fetch('index.html'), fetch('http://does-not-exist')];

Promise.all(arr.map(reflect)).then(function(results){
  var success = results.filter(x => x.status === "fulfilled");
});

在此範例中,我們將Reflect 應用於陣列中的每個Promise 。產生的陣列現在包含每個請求的具有狀態和錯誤或值屬性的物件。

現代替代方案:Promise.allSettled

Promise.allSettled([promise]).then(([result]) => {
  // Code will execute regardless of the promise's state
  // { status: "fulfilled", value: 33 }
});
對於現代解決方案,請考慮使用內建的 Promise.allSettled :

此方法提供了一種便捷的方法來處理所有已解決的承諾,無論它們如何

透過利用這些技術,您可以優雅地管理非同步操作並訪問所有承諾的結果,甚至是那些失敗的結果,從而使您能夠根據可用數據做出明智的決策。

以上是如何在非同步 JavaScript 中處理所有 Promise,包括被拒絕的 Promise?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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