無論失敗如何處理Promise
在處理一組涉及網路請求的Promise 時,通常需要處理某些請求的場景可能會處理某些請求的場景可能會失敗。預設情況下,Promise.all() 在遇到第一次拒絕時提前終止。但是,在某些情況下,您可能希望等到所有 Promise 完成,即使是那些失敗的 Promise。
建議模式
一種方法是使用Reflect() 函數,它將Promise 轉換為Promise,該Promise 解析為具有已完成或已拒絕屬性的狀態對象。透過將陣列中的 Promise 對應到 Reflect() 函數,您可以確保所有 Promise 完成,無論其狀態為何。
const reflect = p => p.then(v => ({ v, status: "fulfilled" }), e => ({ e, status: "rejected" })); Promise.all(arr.map(reflect)).then(results => { const success = results.filter(x => x.status === "fulfilled"); });
在此範例中,Promise.all() 與修改後的一系列 Promise,等待所有 Promise 完成。 success 陣列將包含成功 Promise 的結果,使您能夠優雅地處理網路故障,並仍根據可用資料繼續執行操作。
改進的解決方案(Promise.allSettled)
內置於現代JavaScript 中的是Promise.allSettled,它提供了一種更簡潔、更有效的方法來實現所需的行為。它會傳回解析為結果陣列的 Promise,每個結果都包含已完成或拒絕的狀態,無論 Promise 的結果為何。
Promise.allSettled([promise]).then(([result]) => { // reach here regardless // { status: "fulfilled", value: 33 } });
以上是如何在 JavaScript 中處理所有 Promise,甚至是那些失敗的 Promise?的詳細內容。更多資訊請關注PHP中文網其他相關文章!