簡體   English   中英

處理承諾鏈中的錯誤

[英]Handling errors in promise chains

在承諾鏈中可能會發生兩類錯誤。

  1. 從承諾鏈內部拋出的錯誤(使用.catch處理)
  2. 配置承諾鏈時引發的錯誤

我的問題是如何最好地應對后者。

例如,下面的.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.

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