2016-02-23 90 views
0

我有一個API與幾個服務和方法。我想手動處理這些調用中的一部分,例如,如果錯誤有所期望,則向用戶顯示一條有用的錯誤消息。Promise默認捕捉執行與覆蓋

對於其餘的調用,我想要一個「catch」的默認實現,它將發出一條消息,表示某個全局偵聽器將處理並顯示更一般的錯誤消息。

我發現了另一個堆棧溢出後幾乎給了我什麼,我想: Promises and generic .catch() statements

也就是說,默認追趕但重新拋出的錯誤。問題是,如果我爲某些特定的服務實現自己的捕獲,我不希望泛型catch被踢入,因爲這會顯示一個全局通用錯誤。

是否有一種方法可以實現捕獲的默認實現,如果捕獲是手動實現的,則會覆蓋它?

例如:

let promise = pageService.getPage({pageId}) 
.then((resp) => {}) 
// on error, use the default catch 

let promise = pageService.getPage({pageId}) 
.then((resp) => {}) 
.catch((error) => { /* I want to handle the error, override the default error implementation */}) 
+2

讓我們假設這段代碼完全同步於try/catch的異常處理 - 你將如何編寫它? –

回答

0

據我所知,承諾「先來先服務」的基礎上工作,這意味着第一個註冊的捕捉功能也將被稱爲第一個。

到目前爲止我唯一能提出的醜陋解決方法是擴展正在處理的錯誤,以便我可以識別它是否已被處理。如果我們拿你之前的例子:

const pageService = { 
    getPage: (pageId) => { 
     return doStuff(). catch((error) => { 
      error.handled = false; 
      setTimeout(() => { 
       if(!error.handled) { 
        // do your default handling 
       } 
      )}, 1); 
     }); 
     throw error; //Let possible other handlers first have their go 
    } 
} 

let promise = pageService.getPage({pageId}) 
.then((resp) => {}) 
// on error, use the default catch 

let promise = pageService.getPage({pageId}) 
.then((resp) => {}) 
.catch((error) => { 
    //handle the error here 
    error.handled = true; 
})