订阅回调之前可拦截的可观察对象

时间:2018-09-15 15:51:31

标签: rxjs

我正在使用以下代码进行获取请求:

    makeGetReq$(url:string):Observable{
        let getReqObservable;
        getReqObservable = this.httpClient.get(url) //code for making get request
        return getReqObservable
    }

问题是有时我的后端可能返回状态代码为200的{error:true, message}。(我知道这很奇怪)。在这种情况下,我想了解getReqObservable并不允许其订阅回调运行。 / p>

image.component.ts

    makeGetReq$(url:string):Observable{
         let getReqObservable;
         getReqObservable = this.httpClient.get(url)//code for making get request
         return getReqObservable
                    .do((value)=>{
                       if(value.error){
                       //do not allow it to propagate further
                      })

      })

2 个答案:

答案 0 :(得分:1)

将其进一步传播,但应将其传播为错误而不是事件(例如,就像后端执行正确的操作并返回错误响应一样):

makeGetReq$(url: string): Observable<Something> {
  return this.httpClient.get<Something>(url).pipe(
    mergeMap(value => value.error ? throwError(value) : of(value))
  );       
}

否则,调用方法无法知道发生了错误,因此无法执行可能已为错误注册的回调。

答案 1 :(得分:0)

最简单的方法可能是filter

  

仅通过发出满足指定谓词的项来过滤源发出的项。

它看起来像这样:

return getReqObservable
    .filter(value => !value.error)

有人指出,如果仅过滤掉错误情况,您将完全丢失通知。当然,可以选择使用throwError创建RxJS错误通知,但是也可以使用不同的过滤条件只订阅第二次可观察到的相同源。

但是请注意不要两次调用后端,例如通过使用share