133 votes

Observable Enfin sur Souscrire

Selon cet artcle, onComplete et onError fonction de l' subscribe sont mutuellement exclusifs.

Soit onError ou onComplete événements feu dans mon subscribe.
J'ai une logique de bloc qui doit être exécutée si j'ai un message d'erreur, ou j'ai fini mon steam de données avec succès.

J'ai regardé pour quelque chose comme finally en python, mais tout ce que je trouve est - finally qui doit être relié à la observables j'ai créer.

Mais je veux faire cette logique que lorsque je m'abonne, et après le cours d'eau est terminé, que ce soit avec succès ou avec une erreur.

Des idées?

163voto

Martin Points 1093

Le courant "pipable" variante de cet opérateur est appelé finalize(). La plus ancienne et obsolète "patch" de l'opérateur a été appelé finally().

Je pense que finalize() opérateur est effectivement correcte. Vous dites:

faire cette logique que lorsque je m'abonne, et après le cours d'eau est terminé

ce qui n'est pas un problème je pense. Vous pouvez avoir un seul source et l'utilisation finalize() avant de vous abonner si vous le souhaitez. De cette façon, vous n'êtes pas obligé de toujours utiliser finalize():

let source = new Observable(observer => {
  observer.next(1);
  observer.error('error message');
  observer.next(3);
  observer.complete();
}).pipe(
  publish(),
);

source.pipe(
  finalize(() => console.log('Finally callback')),
).subscribe(
  value => console.log('#1 Next:', value),
  error => console.log('#1 Error:', error),
  () => console.log('#1 Complete')
);

source.subscribe(
  value => console.log('#2 Next:', value),
  error => console.log('#2 Error:', error),
  () => console.log('#2 Complete')
);

source.connect();

Cette affiche sur la console:

#1 Next: 1
#2 Next: 1
#1 Error: error message
Finally callback
#2 Error: error message

Jan 2019: mise à Jour pour RxJS 6

111voto

Hari Das Points 326

La seule chose qui a fonctionné pour moi est cette

 fetchData()
  .subscribe(
    (data) => {
       //Called when success
     },
    (error) => {
       //Called when error
    }
  ).add(() => {
       //Called when operation is complete (both success and error)
  });
 

27voto

pcasme Points 73

Je suis maintenant à l'aide de RxJS 5.5.7 dans Angulaire de l'application et l'utilisation de finalize opérateur a un comportement bizarre pour mon cas d'utilisation, puisqu'il est lancé avant que le succès ou d'erreur de rappels.

Exemple Simple:

// Simulate an AJAX callback...
of(null)
  .pipe(
    delay(2000),
    finalize(() => {
      // Do some work after complete...
      console.log('Finalize method executed before "Data available" (or error thrown)');
    })
  )
  .subscribe(
      response => {
        console.log('Data available.');
      },
      err => {
        console.error(err);
      }
  );

J'ai dû utiliser l' add medhod dans l'abonnement à accomplir ce que je veux. Fondamentalement, un finally de rappel après le succès ou d'erreur rappels sont fait. Comme un try..catch..finally bloc ou Promise.finally méthode.

Exemple Simple:

// Simulate an AJAX callback...
of(null)
  .pipe(

    delay(2000)
  )
  .subscribe(
      response => {
        console.log('Data available.');
      },
      err => {
        console.error(err);
      }
  );
  .add(() => {
    // Do some work after complete...
    console.log('At this point the success or error callbacks has been completed.');
  });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X