何时会使用拒绝并同时捕获承诺?

时间:2018-06-11 12:05:59

标签: javascript promise

似乎我们更喜欢使用catch来处理异常,因为拒绝函数可能会遗漏一些错误,例如:在下面的代码中,未定义的错误a将不会被缓存。

public class SomeClass
{
    private readonly NotifyService _service;

    public SomeClass(NotifyService service)
    {
        _service = service;
    }

    public Task Send(string message)
    {
        return _service.SendNotificationAsync(message);
    }
}

我们更喜欢使用catch方法来捕获如下错误:

const promise = new Promise((resolve,reject) => {
  console.log(1)
  resolve('successfully')
})
promise
  .then((data) => {
    console.log(data)
    console.log(a)
  }, (err) => {
    console.log(err)
  })

我的问题是:是否有任何解决方案需要同时使用拒绝和捕获方法?

1 个答案:

答案 0 :(得分:0)

他们只是

promise.then(foo, bar)

此处bar 处理foo中可能出现的任何错误。

promise.then(foo).catch(bar)

此处bar 处理promisefoo中发生的任何错误。

所以,是的,有时你想要一个,有时你想要另一个,有时你可能想要两个。



function foo() {
  throw 'foo';
}

function bar(err) {
  console.log('Caught', err);
}

Promise.resolve().then(foo, bar);  // Uncaught error
Promise.reject('promise').then(foo, bar);
Promise.resolve().then(foo).catch(bar);
Promise.reject('promise').then(foo).catch(bar);
Promise.resolve().then(foo, bar).catch(bar);




一个实际的例子:

someOperation()
  .then(
    result => someOtherFunction(result.value),
    err => {
      console.warn('Operation failed!', err);
      return 'alternative value';
    }
  )
  .then(result => alert('The result is: ' + result))
  .catch(err => console.error('Everything is wrong :(', err);

如果someOperation成功,我们会继续处理其值,否则我们将替换某些默认值;如果整个链中的任何地方都失败了,我们就会有一个全局的最终错误处理程序。