首页 文章

处理承诺链中的错误

提问于
浏览
5

承诺链中可能会出现两类错误 .

  • 从promise链中抛出的错误(由 .catch 处理)

  • 配置promise链时抛出错误

我的问题是如何最好地处理后者 .

例如,在下面的 .catch 中,它不会捕获 foo 在有机会返回promise之前抛出的异常 .

function go() {
    return foo()
        .then(bar)
        .catch(bam);
}

显然,我可以将 go 的内容包装在 try-catch 块中 .

但是,将 foo 中的catch块立即拒绝的承诺返回到"maintain the API"并且为所有可能性设置基于承诺的界面会更好吗?

4 回答

  • 1

    或者你可以更明确地做:

    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 的所有用法 .

  • 1

    或者,您可以在链中包含 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);
    }
    
  • 0

    你可以宣传 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();
    
  • 1

    使用建议的(阶段3) async 函数 . 它们保证返回一个promise,因此您不必担心在设置promise链时捕获同步异常 .

    (async () => {throw new Error})().catch(::console.error)
    

相关问题