web-dev-qa-db-fra.com

erreur de projection à l'intérieur de rxjs observable

J'essaye de lancer une erreur dans un observable rxjs

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

l'erreur 1 n'est pas interceptée.

error2 donne une erreur de compilation:

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'

quelle est la bonne façon de lancer une erreur dans un observable?

15
phzonta

Utilisation 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

Lorsque vous utilisez new Observable() ou Observable.create(), vous pouvez transmettre l'erreur directement à l'abonné (observateur):

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

La fonction anonyme passée à new Observable() peut éventuellement renvoyer un rappel de désabonnement. C'est pourquoi cela vous donne l'erreur parce que vous retournez un observable.

L'utilisation de Observable.throw("error1") n'est généralement pas nécessaire. Ceci est juste un observable qui n'émet qu'une erreur et rien de plus. Vous pouvez l'utiliser par exemple comme ceci:

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

Voir la démo en direct: https://jsbin.com/fivudu/edit?js,console

4
martin

Avec un observable que vous avez créé vous-même, vous avez accès à la méthode observer.error().

const obs = Observable.create(observer => {

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

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

});

Remarque: si vous utilisez RxJS 4, vous devrez utiliser onNext() et onError() à la place.

1
AngularChef