[英]Handling errors in promise chains
在承諾鏈中可能會發生兩類錯誤。
.catch
處理) 我的問題是如何最好地應對后者。
例如,下面的.catch
不會捕獲foo
有機會返回諾言之前拋出的異常。
function go() {
return foo()
.then(bar)
.catch(bam);
}
顯然,我可以將go
的內容包裝在try-catch
塊中。
但是,從foo
的catch塊返回立即被拒絕的諾言以“維護API”並為所有可能的事件提供基於諾言的接口會更好嗎?
或者,您可以在鏈中包括foo
,如下所示
Promise.resolve()
.then(foo)
.then(bar)
.catch(bam);
現在,即使foo
拋出了, bam
也會照顧它。
或者,在foo
構建包裝器,
function promiseWrapper(func) {
try {
return Promise.resolve(func());
} catch (e) {
return Promise.reject(e);
}
}
然后使用它,而不是foo
,就像這樣
function go() {
return promiseWrapper(foo)
.then(bar)
.catch(bam);
}
或者,您可以更明確地執行以下操作:
function foo() {
try {
// some staff which should return promise
}
catch(e) {
retrun Propmise.reject('the reason');
}
}
然后使用
function go() {
return foo()
.then(bar)
.catch(bam);
}
現在,您無需更改foo
所有用法。
使用建議的(第3階段) async
功能。 他們保證返回承諾,因此您不必擔心在設置承諾鏈時捕獲同步異常。
(async () => {throw new Error})().catch(::console.error)
您可以承諾foo
以便在foo
觸發器內自動發生任何錯誤都會觸發拒絕函數。 如;
function foo(){ throw new Error("booom"); return Promise.resolve(42); } function bar(v) { console.log("I am resolved with " + v())} function baz(v) { console.log("I am rejeceted because of a " + v)} function go() { Promise.resolve(foo) .then(bar) .catch(baz); } go();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.