異步函數的 neverthrow 有什麼意義?

badnun872

起初我在整個打字稿/節點應用程序中使用了 throw 和 catch 之後,我偶然發現了 neverthrow(https://www.npmjs.com/package/neverthrow)。

我寫了我的第一個更大的應用程序和打字稿,才意識到缺少將函數標記為 throwing 的能力實際上是一個多麼大的問題。

neverthrow 或其他基於任何一種的解決方案似乎都很好。對於我的非異步函數,我已經將所有內容更改為 neverthrow。

我真的不明白這一點,為什麼我應該費心去包裝我所有的異步函數來返回 ResultAsync 。任何異步函數都被標記為可能在本質上拋出錯誤(因為它們返回一個 Promise),還是我錯了?我是否遺漏了任何一點,我確實應該將所有異步函數更改為使用 ResultAsync?

約拿

使用類似ResultAsync<T, E>類型而不是Promise<T>.

從類型本身可以看出,前一個選項有一個E泛型參數,指示結果可能包含的錯誤類型。這非常有益,因為您可以獨立處理每種錯誤類型,而不是捕獲通用錯誤實例。HTMLImageElement.decode 為例它返回一個可能會拋出的承諾EncodingError,但如果不檢查文檔,你就不會知道。

另一個好處來自被迫處理潛在的錯誤結果。Javascript 錯誤是未經檢查的,這意味著沒有編譯器或解釋器來確保您始終包含await promise在 try-catch 中。另一方面,當您 時await result,您必須檢查它是否產生了結果 ( result.isOk() === true) 或拋出了錯誤 ( result.isErr() === true)。這意味著每次您想要解包(TResult<T, _>)結果時,您都必須處理潛在的錯誤情況。從理論上講,這會產生更健壯和故障安全的代碼。

然而,結果並非沒有缺點。Javascript 生態系統採用 Promise 作為異步返回事物的標準方式,因此ResultAsync可能無法在任何地方工作Promise此外,每次要解包結果時都必須處理潛在的錯誤結果,這會使代碼變得更加冗長。

如果您主要處理在同一個項目中編寫的異步代碼並認為您可以從更多的故障安全代碼中受益,那麼ResultAsync在您使用Promise.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

為什麼異步函數會阻塞?

為什麼我的 Dart 異步函數沒有立即開始工作

為什麼在python中沒有執行異步函數

為什麼在 Dart 的異步函數中沒有以這種方式捕獲異常?

getopt_long 函數中“:”的意義是什麼?

為什麼調用 useState 鉤子的 set 函數會立即應用於異步函數?

包裝異步函數的函數的 TypeScript 類型定義

使用“隱式解包可選”作為函數參數類型有什麼意義?

為什麼我的數據在異步函數 nodejs 打字稿中更新之前返回狀態

僅在類型構造函數上多態的實例有什麼意義?

在帶有參數的 .then 函數上使用異步等待

將同步函數轉換為在引擎蓋下沒有異步作業的異步函數會帶來性能損失嗎?

React hooks:為什麼異步函數中的多個 useState setter 會導致多次重新渲染?

為什麼使用異步函數“getDownloadURL”來獲取 Firebase 存儲中的文件 URL

為什麼 Next JS 中的異步函數在我的 Typescript 代碼中返回空對象?

為什麼即使我加載了從異步函數中獲取的文檔數組也是空的?

為什麼這兩個非常相似的異步 Rust 函數之一會觸發線程安全錯誤?

如果我明確返回一個 Promise,我應該定義異步函數嗎?

有沒有辦法在不涉及 Web API 的情況下編寫異步代碼/函數?

未定義 LVGL 函數 - 為什麼?

添加具有默認參數的異步事件處理程序的正確方法是什麼?

為什麼純虛擬析構函數沒有隱式默認定義?

在某些 C++ 標準庫中定義類而不是函數有什麼好處?

如何在向量中存儲來自具有相等簽名的 2 個不同異步函數的 Futures

此錯誤源於在沒有 catch 塊的情況下拋出異步函數內部,或拒絕未處理的承諾

異步函數之後的函數

那麼,為什麼我必須在基類中定義虛函數?

如果中間件函數沒有在同一個文件中定義,為什麼我的中間件函數不起作用?

為什麼我的 onsubmit 驗證函數沒有提交我的函數?