0

In my application I have some methods returning an Observable:

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

then I call this method in several places around my application:

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!'); }
);

I was wondering if there is a way inside myMethodReturningObs(...) to attach the a default error handling function, which in my example would be console.log('Error!');, so I don't have to repeat it every time I subscribe to the Observable returned by myMethodReturningObs(...).

Ideally I need something like:

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

so then I can just do:

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

// ...

this.service.myMethodReturningObs().subscribe(
 (data) => { /* do something else with data */ }
);
Francesco Borzi
  • 56,083
  • 47
  • 179
  • 252

1 Answers1

2

You can catch error in base observable, log it and propogate further

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)
        });
}
udalmik
  • 7,838
  • 26
  • 40
  • it works, but now my unit test are broken: `TypeError: Cannot read property 'catch' of undefined` – Francesco Borzi Nov 23 '17 at 13:51
  • 1
    Seems you mocked http service and it return undefined. You can adjust it to return empty Observable. – udalmik Nov 23 '17 at 14:15
  • done it, but now I'm getting another error: `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: }) }).` – Francesco Borzi Nov 23 '17 at 14:17