2016-07-27 49 views
0

我該如何處理藍鳥協程中的錯誤?bluebirdjs協同程序錯誤處理(瀏覽器)

我在節點中使用了一段時間,它有一個很棒的捕捉功能。

co(function*() { 

    return new Promise(function(resolve, reject) { 
     // whatever stuff 
    }); 

}).catch(function(err) {console.error(error.stack)}); 

但與瀏覽器/客戶端的藍鳥這是一個完全的噩夢。沒有捕捉功能和我回來的錯誤 - 如果有的話 - 是匿名或未處理,這是總腦力...

我檢查了bluebirdjs的網站,並且有關於如何進行的討論在幾個月前處理錯誤。即使有人寫道:

應該有一個更好的例子,強調使用try,catch和最終在協程中的好處。

http://bluebirdjs.com/docs/api/promise.coroutine.html

我的意思是:呵,catch終於嵌套在協程?我承認,我甚至一直遵循這個建議來做幾個例行公事,但我似乎並不正確。 Promises和協程的全部要點是擺脫醜陋的過度嵌套,這些回調創造了什麼?再來一次?

請,如果有人有一個想法如何bluebirdjs錯誤mayhem可以變成更好的解決方案,我真的很感激它。

+0

'Promise.coroutine' =='co.wrap'。兩個返回函數都返回帶有catch方法的promise。 – Bergi

+0

@Bergi愚蠢的我,你是對的。我想這樣的 * Promise.coroutine(/ *發電機東西* /)。捕捉(處理)invokation之前設置捕捉*的 代替 * Promise.coroutine(/ *發電機東西* /)。() .catch(處理程序)* – LongHike

回答

0

如果co是藍鳥Promise.coroutine它會自動傳播錯誤並記錄未處理的拒絕。

記錄未處理的錯誤。您可以處理以下錯誤:

Promise.coroutine(function*() { 
    try { 
     doSomething(); 
     yield doSomethingAsync(); 
    } catch (e) { 
     // handle error 
    } 
})(); 
+0

當然,你的答案是正確的。但事情是:它不應該是這樣的。我錯誤已經被doSomethingAsync捕獲,那麼在協程中不應該有另一個try/catch塊。 – LongHike

+0

對,它確實是這樣工作的 - 你有過不同的經歷嗎? –