2017-02-15 65 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

捕获,所以在生产者抛出的错误抛出新的错误()'被有效地忽略和不报告? –