首頁 > web前端 > js教程 > 我們需要 Promise.allSettled() 嗎?

我們需要 Promise.allSettled() 嗎?

DDD
發布: 2024-11-30 16:47:14
原創
740 人瀏覽過

Do we need Promise.allSettled()?

你對 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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板