2017-02-15 52 views
8

Próbuję rzucić błąd wewnątrz rxjs obserwowalnychbłąd rzut wewnątrz rxjs obserwowalnych

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

Błąd 1 nie zostanie złapany.

error2 daje błąd kompilacji:

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' 

co jest właściwy sposób, aby rzucić błąd wewnątrz zauważalny?

+0

spróbować rzucanie błąd jak 'Observable.throw (nowy błąd ("ERROR1"))'. –

+0

@JyothiBabuAraja nie działa. Nie jest przechwycony przez subskrybować() – phzonta

Odpowiedz

8

Zastosowanie 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>

1

Z ty sam stworzył obserwowalne, masz dostęp do metody observer.error().

const obs = Observable.create(observer => { 

    // Emit a value. 
    observer.next("hello"); 

    // Throw an error. 
    observer.error("my error"); 

}); 

Uwaga: jeśli używasz RxJS 4, będziesz musiał użyć onNext() i onError() zamiast.

3

Podczas korzystania new Observable() lub Observable.create() można wcisnąć błędu bezpośrednio do abonenta (obserwator):

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

anonimowej funkcji przekazany do new Observable() mogą ewentualnie zwrócić wypisz zwrotnego. Dlatego daje błąd, ponieważ zwracasz Observable.

Korzystanie z Observable.throw("error1") zwykle nie jest konieczne. To tylko obserwowalne, które emituje tylko błąd i nic więcej. Można go używać na przykład tak:

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

Zobacz demo na żywo: https://jsbin.com/fivudu/edit?js,console

+0

, więc są zgłaszane błędy wewnątrz producenta 'throw new Error()' są skutecznie ignorowane i nie są zgłaszane? –