在非同步程式設計中,當某些任務失敗時,處理 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 會在第一個失敗的請求時拒絕,我們遇到了一個問題:我們如何處理所有任務的結果,甚至是那些失敗的任務?
To為了解決這個問題,我們可以採用以下原生JavaScript 技術:
const reflect = p => p.then(v => ({ v, status: "fulfilled" }), e => ({ e, status: "rejected" }));
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"); });
現代替代方案:Promise.allSettled
Promise.allSettled([promise]).then(([result]) => { // Code will execute regardless of the promise's state // { status: "fulfilled", value: 33 } });
此方法提供了一種便捷的方法來處理所有已解決的承諾,無論它們如何
透過利用這些技術,您可以優雅地管理非同步操作並訪問所有承諾的結果,甚至是那些失敗的結果,從而使您能夠根據可用數據做出明智的決策。以上是如何在非同步 JavaScript 中處理所有 Promise,包括被拒絕的 Promise?的詳細內容。更多資訊請關注PHP中文網其他相關文章!