Rxjs 在订阅回调之前截获可观测值
我正在使用以下代码发出get请求: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
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))
);
}