你對 Promise.allSettled() 有何看法?
對我來說,allSettled 看起來像是尋找問題的解決方案。這個問題是開發人員不處理錯誤。
Promise.allSettled() 的設計很簡單:
const allSettled = (promises) => Promise.all(promises.map(entry => entry .then((value) => ({ status: 'fulfilled', value })) .catch((reason) => ({ status: 'rejected', reason })) ));
它提供了一個「一致」的結果物件- 嗯,狀態是一致的,因此您可以比使用Object.hasOwn() 更乾淨地使用.filter(),但值和原因是故意不同的,因此您不能將它們混淆。
大多數情況下,allSettled 會為您的每個 Promise 添加一個 .catch()。
但我的癥結在於:如果您並行調用一組服務並且您知道一個或多個服務可能會失敗,但這並不重要......為什麼您不為此編寫錯誤處理?
const getFlakyService = (payload) => fetch(flakyUrl, payload); Promise.allSettled([ getFlakyService({ type: 'reptiles' }), getFlakyService({ type: 'mammals' }), getFlakyService({ type: 'birds' }), getFlakyService({ type: 'amphibians' }), ]).then((outcomes) => outcomes .filter(({ status }) => status === 'fulfilled')) });
與此相比,我們節省了多少精力:
const getFlakyService = (payload) => fetch(flakyUrl, payload) // We don't really care about the failures .catch(() => undefined); Promise.all([ getFlakyService({ type: 'reptiles' }), getFlakyService({ type: 'mammals' }), getFlakyService({ type: 'birds' }), getFlakyService({ type: 'amphibians' }), ]).then((data) => { /* ... */ });
如果您關心哪些呼叫失敗,您可能需要可訪問的請求資訊以進行跟踪,但不能保證該資訊在原因中可用。在這種情況下,Promise.allSettled 的幫助就更小了,編寫自己的錯誤處理更有意義。
const getFlakyService = (payload) => fetch(flakyUrl, payload) // Send the failures details to a tracking/logging layer .catch((error) => trackRequestError(flakyUrl, payload, error); Promise.all([ getFlakyService({ type: 'reptiles' }), getFlakyService({ type: 'mammals' }), getFlakyService({ type: 'birds' }), getFlakyService({ type: 'amphibians' }), ]).then((data) => { /* ... */ });
我承認「結果」的標準化可能會很方便。透過 allSettled,您可以在失敗全部完成後對失敗進行計數。但自訂錯誤處理也是如此。
在不久的將來我將繼續使用 Promise.all(),但我有興趣了解您對 Promise.allSettled() 的用例以及您為什麼喜歡它。
以上是我們需要 Promise.allSettled() 嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!