Rxjs 在订阅回调之前截获可观测值

Rxjs 在订阅回调之前截获可观测值,rxjs,Rxjs,我正在使用以下代码发出get请求: makeGetReq$(url:string):Observable{ let getReqObservable; getReqObservable = this.httpClient.get(url) //code for making get request return getReqObservable } 问题是有时我的后端可能返回状态代码为200的{error:true,message

我正在使用以下代码发出get请求:

    makeGetReq$(url:string):Observable{
        let getReqObservable;
        getReqObservable = this.httpClient.get(url) //code for making get request
        return getReqObservable
    }
问题是有时我的后端可能返回状态代码为200的
{error:true,message}
。(我知道这很奇怪)。在这种情况下,我想输入
getReqObservable
,不允许其订阅回调运行

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
                      })

      })

最简单的可能是
过滤器

通过仅发送满足指定谓词的项来过滤源可观测项发出的项

它看起来是这样的:

return getReqObservable
    .filter(value => !value.error)
有人指出,如果只是过滤掉错误案例,则会完全丢失通知。当然,可以使用
throwError
创建RxJS错误通知,但也可以使用不同的过滤条件订阅第二次可观察到的相同源


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

应该将其进一步传播,而是作为一个错误而不是一个事件(即,就像您的后端做了正确的事情并返回了错误响应一样):

makeGetReq$(url:string):可观察{
返回此.httpClient.get(url).pipe(
合并映射(value=>value.error?抛出器错误(value):of(value))
);       
}

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

不知道您是否给了我-1,但将服务器错误转换为RxJS错误并不是处理错误的唯一解决方案。。。第二次订阅错误案例(即更改筛选器谓词)同样合法。OP没有询问如何创建RxJS错误通知…第二次订阅将发送第二个HTTP请求。所以不,这也是个糟糕的主意。这比扔东西更不方便。这使得它不可能将逻辑封装在服务中,它属于哪个位置。我可能也会使用错误通知,但OP问…:“不允许它进一步传播”,错误是一种传播。但是如果一个人想明确地处理错误,你的解决方案可能会更好。我猜他实际上想问如何处理这种情况,以及如何避免将其作为事件传播。如果有人问我如何做他不应该做的事情,我更愿意告诉他如何以正确的方式解决问题。
makeGetReq$(url: string): Observable<Something> {
  return this.httpClient.get<Something>(url).pipe(
    mergeMap(value => value.error ? throwError(value) : of(value))
  );       
}