如何在承诺中使用 .catch 处理错误

How to handle errors using `.catch` in promises

我想在我的承诺没有错误时继续执行代码,但是如果有任何错误,我不想继续。我该如何优雅地处理这种情况?

例如

/* start of REST call */
const resultA = fetchThings()
    .then(things => returnSomeResult(things))
    .then(...)
    ...
    .catch(err => throw err);  // cannot proceed computation if there is error
    
const resultB = fetchOtherThings()
    .then(otherTings => returnOtherResult(otherThings))
    .then(...)
    ...
    .catch(err => throw err); // cannot proceed if there is error

const resultC = Promise.all([resultA, resultB]) => { // do other stuff }

// return resultC from REST call if successful

当任一结果出现错误时,我在终端上收到 UnhandledPromiseRejectionWarning。它声明 This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with a .catch()。我怀疑这是因为我在 catch 块中抛出了错误。

但是,当 resultA 或 resultB 出现错误时,我不希望代码继续。

我怎样才能更好地处理我的这种情况?

我的猜测是您没有处理 Promise.all() 抛出的错误,如果它正在处理的任何 promise 将被拒绝,则该错误将被拒绝。

所以你也需要在那里捕获错误:

Promise.all(…).then(…).catch(e => …)

FWIW,你的 catch() 是多余的:

.catch(err => throw err)

您正在捕获抛出的错误并重新抛出它们,这是不必要的(它们将被附加到 Promise.all().catch() 捕获)。