【问题标题】:Catching a Promise rejection error with an Observable in Angular 6在 Angular 6 中使用 Observable 捕获 Promise 拒绝错误
【发布时间】:2019-01-04 23:24:15
【问题描述】:

我一直在尝试对包装 Promise 的 Observable 中的错误处理进行单元测试,但我似乎根本无法让它捕捉到错误。
我正在从一个只会拒绝的承诺中设置一个可观察的,然后我从 spyOn 中返回它。这适用于正确解决的承诺,但在拒绝时,我收到错误:'错误:未捕获(承诺中):错误'

我的代码:

   it(
  'should not change status if unsucessful',
  fakeAsync(() => {

    const obs = from(
      new Promise(resolve => {
        return Promise.reject('error');
      })).pipe(catchError( (error) => {
        console.log('oh no');
        return of(error);
      }));

    spyOn(
      mockService,
      'ChangeStatusToAvailable'
    ).and.returnValue(obs);
    component.SetStatusToAvailable();
    tick(200);
    fixture.detectChanges();
    console.log(component._status);
    expect(component._status).toBe(AgentStatus[AgentStatus.disconnected]);
  })
);

感谢您的帮助!

【问题讨论】:

    标签: javascript angular promise rxjs observable


    【解决方案1】:

    您的Promise 构建不正确。

    见MDN:

    执行者
    使用参数 resolve 和 reject 传递的函数。 executor 函数由 Promise 实现立即执行,传递 resolve 和 reject 函数(在 Promise 构造函数甚至返回创建的对象之前调用 executor)。
    ...执行者的返回值被忽略。

    在任何情况下,您都不需要手动构建承诺(这实际上是一种反模式)。试试:

    const obs = from(Promise.reject('error'))
    

    【讨论】:

    • 感谢您的评论,但构建 Promise 只是为了可见性,因为这仅用于单元测试/模拟,一旦正常工作就会被重构。非单元测试 observables 包装了 SignalR Promise。更改为 const obs = from(Promise.reject('error'));没有区别 - 观察者仍然没有发现错误。
    • 您是否保留了我们删除的pipe?
    • 通过不理会该死的承诺来修复它。只需创建一个可观察对象: const obs = throwError(new Error('test error'));
    猜你喜欢
    • 2021-04-21
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 2018-10-28
    • 1970-01-01
    • 2016-11-10
    相关资源
    最近更新 更多