簡體   English   中英

Javascript承諾:趕上潮流

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM