首页 > 解决方案 > 如果一个承诺可以被拒绝,那么我们应该如何处理它,或者甚至不处理它或抓住它?

问题描述

如果在某些情况下可以拒绝一个承诺,由于这种拒绝,仍然会抛出一个错误。我们应该如何处理或忽略它?

案例1:如果用户可以点击取消按钮并且操作被取消,并且我们认为这样的取消是可以的,我们是否只是处理它:

p.then(value => {
  // fulfillment handler
}, err => {});   // do nothing

或者

p.then((value) => {
  // fulfillment handler
}).catch(err => {});     // do nothing

或者我们可以完全忽略它而不使用拒绝处理程序或 catch()?

案例2:如果我们做一个

let p = Promise.reject(1);

然后立即抛出异常。连抓它的时间都没有。那么我们必须始终使用:

let p = Promise.reject(1).catch(err => {});

? 实际上,如果p打印了上面,它是一个已解决的承诺,而没有的catch()则是一个被拒绝的承诺,所以我有点困惑。我认为两者都应该处于拒绝状态。

标签: javascriptpromisees6-promise

解决方案


如果您使用承诺拒绝/异常来表示某些事情已被取消,那么捕获此错误是有意义的。

但是,一个重要的经验法则是,如果您捕获一个错误并且您希望抛出某个错误(例如 CancellationError),您应该在您的 catch 子句中确保它是该类型的特定错误。

否则,您将冒着被(空)catch 处理程序抛出并默默吃掉一些其他异常的风险。

所以我通常希望这看起来像这样:

try {
  await someOperation();
} catch (err) {
  if (!(err instanceof Cancellation)) {
    // Re-throw
    throw err;
  }
  console.log('Operation cancelled');
}

推荐阅读