web-dev-qa-db-ja.com

rxjs Observable内でエラーをスローします

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'

オブザーバブル内でエラーをスローする適切な方法は何ですか?

15
phzonta

つかいます - 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>
14
olsn

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

4
martin

自分で作成したオブザーバブルを使用すると、observer.error()メソッドにアクセスできます。

_const obs = Observable.create(observer => {

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

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

});
_

注:RxJS 4を使用している場合は、代わりにonNext()onError()を使用する必要があります。

1
AngularChef