【问题标题】:javascript catch multiple errors with one catchjavascript 一次捕获多个错误
【发布时间】:2020-11-03 02:26:41
【问题描述】:

假设我有 3 个带承诺的函数:

function1().then(() => {
  function2().then(() => {
    function3().then(() => {      
    })
  })
}).catch((err) => {
  console.log(err);
})

我能否捕捉到 3 个函数中的任何一个返回的错误?如果没有,我应该怎么做才能用一条语句捕获任何函数的 promise 返回的错误?

【问题讨论】:

  • 不,您只会在function1 中捕获错误,因为其他两个不是同一个承诺链的一部分。最小示例:Promise.resolve().then(() => { Promise.reject("whoops!") }).catch((err) => console.log(err));
  • 有没有一种方法可以用一条语句捕获错误?
  • 是的,让它们成为同一个承诺链的一部分:Promise.resolve().then(() => Promise.reject("whoops!")).catch((err) => console.log(err));
  • 最简单的形式:function1().then(function2).then(function3).then(() => { /* do whatever */ }).catch(console.log);
  • 更好,Promise.resolve().then(function1).then(function2).then(function3).then(() => { /* do whatever */ }).catch(console.log);

标签: javascript promise


【解决方案1】:

最简单的更改是仅return 内部承诺。这将导致他们的拒绝向上传播到单个.catch(),如下所示:

function1().then(() => {
  return function2().then(() => {
    return function3().then(() => {      
    })
  })
}).catch((err) => {
  console.log(err);
})

但是,这种连续嵌套的 Promise 并不理想(有些人会称之为反模式)。如果你现在真的想要对事情进行排序并且你使用的是现代 JS 环境,那么你可以使用await 对事情进行排序并在一个地方捕获错误:

async someFunction() {
    try {
        let val1 = await function1();
        let val2 = await function2();
        let val3 = await function3();
    } catch(e) {
        // catch any rejections from the above three `await` statements here
        console.log(e);
    }
}

使用await 还可以更轻松地查看代码流并从一个范围内的多个异步调用中收集结果。


没有await,你也可以扁平化你的原始代码:

function1().then(() => {
    return function2().then(() => {
    })
}).then(() => {
    return function3().then(() => {      
    })
}).catch((err) => {
  console.log(err);
})

但是,大多数人会认为await 实现更简单。

【讨论】:

    【解决方案2】:

    你可以在没有嵌套的情况下使用 async/await 或 then

    function1().then(() => Promise.resolve(val1))
    .then(() => Promise.resolve(val2))
     ...
    }).catch((err) => {
      console.log(err);
    });
    

    使用异步/等待:

    try {
        await function1();
        await function2();
        ...
    } catch(err) {
        console.log(error);
    }
    

    【讨论】:

      【解决方案3】:

      不要在正文中调用和链接它们,而是返回结果承诺并链接.then 子句。

      function1().then(() => {
        // TODO: Something.
        return function2();
      }).then(() => { // <-- This `.then` waits until `function2` has finished executing
        // TODO: Something.
        return function3();
      }).then(() => { // <-- This `.then` waits until `function3` has finished executing
        // TODO: Something.
      }).catch((err) => {
        console.log(err);
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-12
        • 1970-01-01
        • 2017-11-24
        • 1970-01-01
        相关资源
        最近更新 更多