【问题标题】:RxJS how to return Observable with default error handling functionRxJS 如何使用默认错误处理函数返回 Observable
【发布时间】:2018-05-07 06:47:11
【问题描述】:

在我的应用程序中,我有一些返回 Observable 的方法:

public myMethodReturningObs(...): Observable {
  return this.http.get(...); // this will return an Observable
}

然后我在我的应用程序周围的几个地方调用这个方法:

this.service.myMethodReturningObs().subscribe(
 (data) => { /* do something with data */ },
 (error) => { console.log('Error!'); }
);

// ...

this.service.myMethodReturningObs().subscribe(
 (data) => { /* do something else with data */ },
 (error) => { console.log('Error!'); }
);

我想知道myMethodReturningObs(...) 内部是否有办法附加默认错误处理函数,在我的示例中为console.log('Error!');,所以我不必每次订阅 Observable 时都重复它由myMethodReturningObs(...)返回。

理想情况下,我需要这样的东西:

public myMethodReturningObs(...): Observable {
  return this.http.get(...)
   .onError({ console.log('Error!'); }); // this will return an Observable
}

所以我可以这样做:

this.service.myMethodReturningObs().subscribe(
 (data) => { /* do something with data */ }
);

// ...

this.service.myMethodReturningObs().subscribe(
 (data) => { /* do something else with data */ }
);

【问题讨论】:

    标签: javascript typescript rxjs observable angular-observable


    【解决方案1】:

    您可以在基本 observable 中捕获错误,记录它并进一步传播

    public myMethodReturningObs(...): Observable {
      return this.http.get(...)
            .catch(e => {
              // log error
              console.error('Failed', e);
              // return same error, so subscriptions also fail
              return Rx.Observable.throw(e)
            });
    }
    

    【讨论】:

    • 它可以工作,但现在我的单元测试被破坏了:TypeError: Cannot read property 'catch' of undefined
    • 似乎你模拟了 http 服务,它返回未定义。你可以调整它以返回空的 Observable。
    • 完成了,但现在我收到另一个错误:Expected $[0] to be a kind of ScalarObservable, but was Observable({ _isScalar: false, source: ScalarObservable({ _isScalar: true, value: 'mock', scheduler: null }), operator: CatchOperator({ selector: Function, caught: <circular reference: Object> }) }).
    猜你喜欢
    • 2020-10-06
    • 2019-04-15
    • 2017-08-02
    • 1970-01-01
    • 2021-07-26
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    相关资源
    最近更新 更多