我只是想知道爲什麼不考慮事實,你可以throw
任何你喜歡的,不只是東西是instanceof Error
的好處。這樣做被認爲是不好的做法?在我看來,這取決於你想要完成什麼。承諾鏈可以因各種原因而中斷,但總的來說,這兩個鏈會分成兩組。需要Classic error occur
和early break in chain
。從邏輯上講,第二個不能被認爲是應該是instance of Error
。
const handleError = (err) => {
...
}
const skip = (reason, ..., ...) => {
/**
* construct whatever you like
* just for example here return reason
*/
return reason
}
Promise.resolve()
.then(() => {
if (iShouldEndChainEarlier) {
throw skip('I would like to end chain earlier')
}
return asyncOperation1()
})
.then(results => {
...
return asyncOperation2(results)
})
.then(... => {
...
})
.catch(interrupt => {
if (interrupt instanceof Error) {
return handleError(interrupt)
}
/**
* Handle breaking promise chain earlier
* having interrupt reason in scope
*/
})
如果從邏輯上講,在鏈初歇可以被視爲錯誤(這完全可以是這種情況),您可以創建自定義錯誤和兩個catch
塊之間進行區分。所以只是說在處理承諾鏈中可能發生的任何中斷時,可以考慮另一種方法。
我們可以爭辯說這是否可以被認爲是針對節點中的first error pattern
的東西。如果出現錯誤,最佳做法是調用回調如callback(err)
,其中err
確實應該是instanceof Error
,否則callback(null, data)
。但在另一方面,記住.catch(fn)
只是糖then(undefined, onRejected)
對我來說,它似乎已經足夠處理onRejected
參數根據你所處的情況。
你不能明確地返回一個新的承諾(一個解決失敗爲從bb中的'then'開始嗎?如果只是「連鎖失敗」不起作用,那麼......它根本就不是連鎖店。 – user2864740 2015-02-17 22:19:18
你會想看看[打破諾言鏈,並調用一個函數的基礎上它的鏈斷裂](http://stackoverflow.com/q/20714460/1048572)和[處理多個捕獲在承諾鏈](http://stackoverflow.com/q/26076511/1048572) – Bergi 2015-02-17 23:55:30