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'
オブザーバブル内でエラーをスローする適切な方法は何ですか?
つかいます - 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>
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
自分で作成したオブザーバブルを使用すると、observer.error()
メソッドにアクセスできます。
_const obs = Observable.create(observer => {
// Emit a value.
observer.next("hello");
// Throw an error.
observer.error("my error");
});
_
注:RxJS 4を使用している場合は、代わりにonNext()
とonError()
を使用する必要があります。