asdasd
asdasd

Reputation: 7220

Intercept observables before subscription callback

I am using the following code to make get request:

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

The problem is sometimes my backend might return {error:true, message} with status code 200. (I know thats weird).In that case I want to intecept getReqObservable and not allow its subscription callback to run.

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

      })

Upvotes: 0

Views: 555

Answers (2)

ggradnig
ggradnig

Reputation: 14169

The easiest would probably be filter.

Filter items emitted by the source Observable by only emitting those that satisfy a specified predicate.

It would look like this:

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

It was pointed out, that you lose the notification completely if you just filter out the error case. There is of course the option to create a RxJS error notification with throwError, but it is also possible to just subscribe to the same source observable a second time with a different filter condition.

Be careful however to not call the backend twice, e.g. by using share.

Upvotes: 0

JB Nizet
JB Nizet

Reputation: 691735

You should propagate it further, but as an error rather than an event (i.e. do just like if your backend did the right thing and returned an error response):

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

Otherwise, the calling method has no way to know that an error occurred, and thus can't execute the callbacks it might have registered for errors.

Upvotes: 1

Related Questions