如何忽略角度1.6.x承诺错误,避免“未处理的拒绝”?

时间:2017-10-30 13:43:45

标签: javascript angularjs promise angular-promise

升级到角1.6.1后,我遇到了承诺处理的问题 想象一下,我在组件中有以下功能:

function action(arg) {
  service
    .doRequest(vm.userId, arg)
    .finally(function(){
      vm.called = true;
    });
}

然后我必须测试成功和错误路径,以确保在两种情况下都设置了vm.called属性。
这里的测试:

describe('when succeeds', function () {
  beforeEach(function () {
    spyOn(service, 'doRequest').and.returnValue($q.resolve())
    subject = createComponent();

    subject.action('test arg');
    $scope.$digest();
  });

  it('should set called property to true', function () {
    expect(subject.called).toBeTruthy();
  });
});

describe('when fails', function () {
  beforeEach(function () {
    spyOn(service, 'doRequest').and.returnValue($q.reject())
    subject = createComponent();

    subject.action('test arg');
    $scope.$digest();
  });

  it('should set called property to true even if something went wrong', function () {
    expect(subject.called).toBeTruthy();
  });
});

在测试错误路径时,由于this change而导致未处理的拒绝错误,因为我没有捕获任何异常。

我也知道它可以通过以下方式修复:

  1. 为测试模块配置$qProvider.errorOnUnhandledRejections(false);
  2. 在主题代码中添加.catch(angular.noop)处理程序,以明确捕获未处理的拒绝。
  3. 修改原始代码以从service.doRequest()调用返回承诺,并在调用.catch(angular.noop)时将subject.action('test arg');处理程序添加到测试本身。
  4. 选项1和2是不可接受的,因为它们会吞下可能发生的所有错误 选项3适用于此特定情况,但如果函数已具有返回值,则无效。

    所以我的问题:有没有办法忽略promise链中的任何错误,但在不使用1-3选项的情况下避免“未处理的拒绝”错误?
    提前谢谢。

0 个答案:

没有答案