web-dev-qa-db-fra.com

Observable Enfin sur Souscrire

Selon cet article , les fonctions onComplete et onError de subscribe s’excluent mutuellement.

Cela signifie que les événements onError ou onComplete se déclencheront dans mon subscribe.
J'ai un bloc logique qui doit être exécuté que je reçoive une erreur ou que je finisse avec succès mon Steam d'informations.

J'ai cherché quelque chose comme finally en python , mais tout ce que j'ai trouvé est finally qui doit être attaché à l'observable que je crée.

Mais je veux faire cette logique uniquement lorsque je m'abonne et après la fin du flux, que ce soit avec succès ou avec une erreur.

Des idées?

75
Amir Tugi

La variante "pipable" actuelle de cet opérateur s'appelle finalize() (depuis RxJS 6). L'opérateur "patch" plus ancien et maintenant déconseillé s'appelait finally() (jusqu'au RxJS 5.5).

Je pense que l'opérateur finalize() est en fait correct. Vous dites:

ne faites cette logique que lorsque je m'abonne et après la fin du flux

ce qui n'est pas un problème je pense. Vous pouvez avoir un seul source et utiliser finalize() avant de vous y 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();

Cela imprime à 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

97
martin

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)
  });
24
Hari Das

J'utilise maintenant RxJS 5.5.7 dans une application Angular et l'utilisation de l'opérateur finalize a un comportement étrange pour mon cas d'utilisation car il est déclenché avant les rappels de succès ou d'erreur.

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 la méthode add de l'abonnement pour accomplir ce que je voulais. En gros, un callback finally après le rappel réussi ou erroné. Comme un bloc try..catch..finally ou une méthode Promise.finally.

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.');
  });
15
pcasme