2017-02-15 5 views
8

Я пытаюсь бросить ошибку внутри rxjs наблюдаемогоошибка броска внутри rxjs Observable

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

Ошибка 1 не зацепила.

Error2 дает ошибку компиляции:

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 (новый Error ("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.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

, так что ошибки, возникающие внутри производителя, «throw new Error()» эффективно игнорируются и не сообщаются? –