2017-02-15 66 views
8

我想扔可觀察擲錯誤內rxjs可觀察

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

錯誤1沒有抓到一個rxjs內的錯誤。

誤差2給出了一個編譯錯誤:

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' 

什麼是拋出內可觀察到的一個錯誤的正確方法?

+0

嘗試拋出一個錯誤,如'Observable.throw(新的錯誤( 「ERROR1」))'。 –

+0

@JyothiBabuAraja不起作用。它不會被訂閱() – phzonta

回答

8

使用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

隨着觀察到你自己創建的,你可以訪問observer.error()方法。

const obs = Observable.create(observer => { 

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

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

}); 

注:如果您使用RxJS 4,你將不得不使用onNext()onError()代替。

3

當使用new Observable()Observable.create()可以直接推錯誤向用戶(觀察者):

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

傳遞給new Observable()匿名功能可任選地返回一個退訂回調。這就是爲什麼它會給你錯誤,因爲你正在返回一個Observable。

使用Observable.throw("error1")通常沒有必要。這只是一個只能發出錯誤而已,僅此而已的Observable。你可以使用它,例如像下面這樣:

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

見現場演示:https://jsbin.com/fivudu/edit?js,console

+0

捕獲,所以在生產者拋出的錯誤拋出新的錯誤()'被有效地忽略和不報告? –