Throw error inside rxjs observed

I am trying to make an error inside rxjs Observable

new Observable(subscriber => { Observable.throw("error1"); return Observable.throw("error2"); }) .subscribe( () => {}, err => console.error(err) ); 

Error 1 is not caught.

error2 gives a compilation error:

 Argument of type '(this: Observable<{}>, subscriber: Subscriber<{}>) => ErrorObservable<string>' is not assignable to parameter of type '(this: Observable<{}>, subscriber: Subscriber<{}>) => TeardownLogic'. Type 'ErrorObservable<string>' is not assignable to type 'TeardownLogic' 

What is the correct way to throw an error inside the observable?

+8
javascript reactive-programming error-handling rxjs
source share
3 answers

Use Subscriber.error :

 new Rx.Observable(subscriber => { subscriber.error("error1"); subscriber.error("error2"); // not called because a stream will be finalized after any error }) .subscribe( () => {}, err => console.error(err) ); 
 <script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script> 
+8
source share

When using new Observable() or Observable.create() you can send an error directly to the subscriber (observer):

 Observable.create(subscriber => { subscriber.error(new Error("error1")); }) .subscribe( () => {}, err => console.log(err.message) ); 

The anonymous function passed to new Observable() may possibly return a unsubscribe callback. This is why it gives you an error because you are returning an Observable.

Using Observable.throw("error1") usually not required. It is just an observable that only emits an error and nothing more. You can use it, for example, as follows:

 Observable.create(subscriber => { subscriber.next('whatever'); }) .merge(Observable.throw(new Error("error2"))) .subscribe( () => {}, err => console.log(err.message) ); 

See the demo: https://jsbin.com/fivudu/edit?js,console

+3
source share

With the observable you created yourself, you have access to the observer.error() method.

 const obs = Observable.create(observer => { // Emit a value. observer.next("hello"); // Throw an error. observer.error("my error"); }); 

Note. If you are using RxJS 4, you will have to use onNext() and onError() .

+1
source share

All Articles