我想使用承諾將調用鏈接到不同的庫。在失敗的情況下,庫方法返回一個描述錯誤的對象,但依賴於庫的不同字段。如何標準化承諾鏈中的錯誤對象?
爲了一致地向被調用者報告任何錯誤,我想規範化所有的錯誤對象遵循一個通用的格式。但我不知道如何以優雅的方式使用Bluebird和/或標準諾言API來做到這一點。
在這裏僞JS是我:
var methodAFromLibX_Async = Promise.promisify(...);
var methodBFromLibY_Async = Promise.promisify(...);
methodAFromLibX_Async(...)
.then(function(result) {
methodBFromLibY_Async(...)
.then(function(result) { ... })
.catch(normalizeAndSendErrorFromLibY);
})
.catch(normalizeAndSendErrorFromLibX);
上面的代碼似乎工作,但:
- 我有
normalizeAndSendErrorFromLibY
和normalizeAndSendErrorFromLibX
- 我之間的冗餘代碼我真正的用例我必須連鎖超過2個電話,並且代碼的金字塔形狀肯定開始看起來像一個回撥地獄...
編輯:爲了更加清楚一點,在這裏我設想的解決方案,但無法實現:
是否有任何理由,你不能在你的鏈條的最後,您歸所有可能的錯誤,然後有一個'catch'「送」起來? – m90
謝謝你的評論@ m90。只有最後一個全局性的catch/catchAll纔會泄露錯誤起源的知識。如我的例子中所解釋的,當錯誤來自不同的lib調用時,使用一堆'if..else'塊,我可以推斷出原點。但是,當我在鏈中調用同一個庫的幾個方法時,追溯回溯更復雜。我不敢相信沒有更優雅的做法...... –
你確定這是你想要的鏈嗎? 'normErrorFromY'處理來自'normErrorFromX'的錯誤? – Bergi