Je suis très nouveau chez rxjs et je me demandais s'il est correct d'installer une propriété de classe en canalisant le flux et en le tapotant, ou si je devais le faire dans l'abonnement. Dans les deux cas, je me demande si je peux le faire comme bon me semble ou si je ne suis pas au courant.
Code TypeScript démontrant les deux manières:
export class ViewComponent implements OnInit {
applicant = {};
constructor(public route: ActivatedRoute, private store: Store<any>) {}
ngOnInit() {
this.route.paramMap.pipe(
switchMap(params => this.store.select(state => state.applicants.entities[params.get('id')])),
tap(applicant => this.applicant = applicant)
).subscribe();
}
}
contre
export class ViewComponent implements OnInit {
applicant = {};
constructor(public route: ActivatedRoute, private store: Store<any>) {}
ngOnInit() {
this.route.paramMap.pipe(
switchMap(params => this.store.select(state => state.applicants.entities[params.get('id')]))
).subscribe(applicant => this.applicant = applicant);
}
}
Bonne question. Dans le code source de l'opérateur tap
, ce commentaire le résume assez bien:
Cet opérateur est utile pour déboguer vos observables avec les valeurs correctes ou pour effectuer d’autres effets secondaires.
Remarque: ceci est différent d’unsubscribe
sur l’observable. Si l'observable renvoyé pardo
n'est pas abonné, les effets secondaires spécifiés par l'observateur ne se produiront jamais.do
espionne donc simplement une exécution existante, cela ne déclenche pas une exécution telle quesubscribe
.
Tout effet secondaire que vous pouvez exécuter dans un tap
peut probablement aussi être placé dans le bloc subscribe
. Le subscribe
indique votre intention d'utiliser activement la valeur source puisqu'il indique "lorsque cet observable émet, je souhaite enregistrer sa valeur dans la variable applicants
". L'opérateur tap
est principalement présent pour le débogage, mais il peut être utilisé pour exécuter des effets secondaires.
En général, privilégiez le bloc subscribe
pour exécuter les effets secondaires, utilisez tap
pour le débogage, mais sachez que tap
peut faire plus si vous en avez besoin.
tap
est utile lorsque l'observable est séparé de son abonné. Si vous avez une classe qui expose une observable, vous pouvez utiliser tap
pour implémenter les effets secondaires que cette classe doit être exécutée lorsque quelqu'un est en écoute à l'observable. De l'autre côté, lorsque vous vous abonnez à cette classe depuis une autre classe, vous pouvez implémenter les effets secondaires du point de vue de l'abonné, en utilisant subscribe
.
Classe à l'observable:
public dummyObservable: Observable<number> = from([1, 2, 3, 4, 5]).pipe(
// Side effects, executed every time I emit a value
// I don't know which side effects implements who subscribes to me
tap( n => console.log("I'm emitting this value:", n) )
);
Classe avec l'abonnement:
ngOnInit(): void {
this.dummyService.dummyObservable.subscribe(
// Side effects, executed every time I receive a value
// I don't know which side effects implements the observable
data => console.log("I'm receiving this value: ", data)
);
}