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