簡體   English   中英

在承諾鏈的早期處理錯誤

[英]Handling Errors early in the Promise Chain

我試圖找到一種處理諾言鏈上錯誤的一般方法。 在下面的片段中,我想直接在connection.js中處理潛在的連接錯誤。

connection.js

function getData() {
  return fetch(myEndpoint)
   .catch(err => handleConnectionError(err)) // redirect to error page or similar
}

app.js

// import connection
connection.getData()
  .then(data => handleData(data.foo))

因此,這種情況可以通過兩種方式發揮作用:

  • 如果我在不拋出新錯誤的情況下在connection.js中捕獲錯誤,它將繼續promise鏈,並且handleData()將失敗
  • 如果我在處理完錯誤后再次拋出錯誤,則Promise鏈將不再執行,但是控制台中將出現未處理的承諾被拒絕錯誤。

因此,除了我每次在應用程序中的某處使用getData()函數時,沒有比捕獲和處理錯誤更好的方法了嗎?

進行此操作的最佳方法是進行最后的處理以解決所有錯誤。 例如:

function errorHandler(e) {
    if (e instanceof x) {
        //handle here
    }
}

接着:

fetch(endPoint).then(doSomething).then(doAnotherThing).catch(err => errorHandler(err))

如果沿鏈條的訪存或任何其他promise產生錯誤,那么其余的then()語句將被跳過,並由最終的catch函數捕獲。 從那里開始,您將需要確保所有諾言可能引發的所有類型的錯誤都得到了解決。

但是,您將需要擺脫getData中的問題,因為它將處理該鏈的其余部分,因為該錯誤已得到解決。

希望能有所幫助

因此,除了我每次在應用程序中的某處使用getData()函數時,沒有比捕獲和處理錯誤更好的方法了嗎?

是的,這正是您應該做的:

function getData() {
  return fetch(myEndpoint)
}

// elsewhere:
connection.getData().then(handleData, handleConnectionError);

您通常不知道是否總是要“ 重定向到錯誤頁面或類似頁面 ”。 也許在應用程序的某些位置,您可以通過偽造響應數據來處理連接錯誤,而在其他位置,您可能希望顯示錯誤消息而不是觸發重定向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM