繁体   English   中英

javascript 一次捕获多个错误

[英]javascript catch multiple errors with one catch

假设我有 3 个带承诺的功能:

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

我能捕捉到 3 个函数中的任何一个返回的错误吗? 如果不是,我应该怎么做才能用一个语句捕获任何函数的承诺返回的错误?

与其在正文中调用和链接它们,不如返回生成的 promise 并链接.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);
});

您可以使用 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);
}

最简单的更改是只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还可以更轻松地查看代码流并从一个 scope 中的多个异步调用收集结果。


如果没有await ,您还可以展平原始代码:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM