[英]Javascript promise: catch flow
在以下代碼中,我希望能夠在foo失敗時退出應用程序,但在goo失敗時退出應用程序。 我的問題是,當goo拒絕時,它會陷入foo的陷阱中。 是否有針對此問題的最佳實踐最佳解決方案?
foo().then(() => {
return goo.catch(() => {
//do something
//reject but don't exit app
})
})
.catch(() => {
//exit app
//reject
})
不要在goo.catch
拒絕-您不希望拒絕傳播到foo.catch
處理程序。
foo().then(() => {
return goo.catch(() => {
// do something but don't reject
})
})
.catch(() => {
// exit app
// reject
})
因此,您輸入catch塊並從錯誤情況“恢復”。 通過投擲/拒絕你進一步傳遞例外,在以下情況下goo
你不希望這樣。
只需從goo.catch()
塊return
(或調用Promise.resolve()
)
const gooError;
foo().then(() => {
return goo.catch(err => {
// set the error thrown in to gooError that is
// declared before the promise chain
// and then simply 'return'
gooError = err;
return;
});
// to ensure goo error is taken outside immediately
// You can omit this if not required.
if (gooError) return;
})
.catch(() => {
// exit app
// reject
})
// check if there was any error by goo
if (gooError) {
// handle goo error here
}
我認為這可以解決問題:
foo()
.catch(() => {
//exit app
//reject
})
.then(() => {
return goo.catch(() => {
//do something
//reject
})
})
讓我們看看您想在同步代碼中實現什么:
function main() {
try {
foo();
} catch(e) {
console.log("Exit process");
throw e;
}
try {
goo();
} catch(e) {
console.log("do something");
throw e;
}
}
您可以通過嵌套捕獲來實現:
function foo() { return Promise.reject(); } function goo() { return Promise.reject(); } function main() { return foo().catch(e => { console.log("Exit process"); // what would be point in rejecting if the process already exited anyway? throw e; }).then(() => { return goo().catch(e => { console.log("Do something"); throw e; }); }); } main().catch(() => { console.log("Main is rejected"); });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.