2015-02-10 183 views
2

我寫了很多代碼使用此模式,並onPossiblyUnhandledRejection處理類似的例子可以在藍鳥的documentation發現:返回的拒絕承諾和藍鳥

var promise4 = Promise.join(promise1, promise2, function (value1, value2) { 
    // promise 3 needs the values resolved from promise1 and promise2 
    return promise3(value1, value2); 
}); 

我的錯誤處理是這樣完成的:

Promise.all([ 
    promise4 
]) 
.catch(function (err) { 
    // handle error 
}); 

問題是,如果promise3被拒絕,它會觸發藍鳥的onPossiblyUnhandledRejection處理程序,因爲它在連接到任何承諾鏈(具有錯誤處理)之前被拒絕。當沒有任何事情發生錯誤時,這會導致大的錯誤信息不斷被打印出來。

我不知道該怎麼做,因爲一方面,上面的模式對於構建併發邏輯非常有用,而且很容易理解,但另一方面,我不想簡單地重寫onPossiblyUnhandledRejection,因爲如果我確實忘記處理某些事情,它可能會有用。

bluebird's documentation樣的地址的這個問題,在一定程度上使得它聽起來好像上面的圖案是一個奇怪的一個:

「如果你因爲某些原因代碼需要趁虛而入並附加錯誤處理的一些承諾在承諾掛了一段時間後,你會看到惱人的消息「

我的」某些原因「是我需要構建高度併發的軟件。這是我接近這種問題的根本缺陷嗎?如果不是,我應該如何解決這個問題而不完全刪除這些警告?

+0

請在代碼中顯示您實際將錯誤處理程序附加到鏈中的位置(以及何時)。 – Bergi 2015-02-10 19:13:09

+0

所以你的錯誤處理程序被稱爲*和*你幾乎在同一時間得到未處理拒絕事件?這聽起來像一個錯誤。 – Bergi 2015-02-10 19:48:05

+0

是的,這發生在我的應用程序的許多地方,但錯誤總是被成功捕獲。如果它改變任何promise3可能是立即被拒絕的東西,例如具有同步邏輯的Promise.try。 – 2015-02-10 19:50:22

回答

1

正如我評論了你的代碼只是正常工作而不報告未處理的拒絕:

function promise3(value1, value2) { 
    return Promise.reject(new Error("the error"))  
} 
var promise1 = Promise.resolve(); 
var promise2 = Promise.resolve(); 
var promise4 = Promise.join(promise1, promise2, function (value1, value2) { 
    // promise 3 needs the values resolved from promise1 and promise2 
    return promise3(value1, value2); 
}); 

Promise.all([promise4]).catch(function(error) { 
    console.log(error.message === "the error") 
}); 

http://jsfiddle.net/6hx0zdd2/

更重要的可能是,你已經忘記了return聲明某處這是需要線失信在一起,使鏈接(和錯誤傳播)的工作。

+0

我傾向於同意你的看法,因爲我構建了自己的孤立示例,但沒有看到問題。儘管如此,我還沒有發現我的實際代碼有什麼問題。 – 2015-02-10 21:06:57

+0

@ TomO'Connell您可以嘗試啓用長堆棧跟蹤並跟蹤跟蹤。例如,在這個jsfiddle我忘了返回,但你可以按照記錄的蹤跡,看看它發生了什麼http://jsfiddle.net/6hx0zdd2/1/ – Esailija 2015-02-10 21:07:52

+0

剛試過這個。被拒絕的承諾肯定會在所有情況下被退回。仍然在尋找原因。我想我應該再次提到我的錯誤處理實際上按預期工作。我現在看到這個問題的地方是當我用故意錯誤的數據爲我的API運行我的摩卡測試時。錯誤被捕獲並按預期處理,但我仍然看到此消息。 – 2015-02-10 21:28:02