如何在承诺中使用 .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()
捕获)。
我想在我的承诺没有错误时继续执行代码,但是如果有任何错误,我不想继续。我该如何优雅地处理这种情况?
例如
/* 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()
捕获)。