web-dev-qa-db-fra.com

appuyez sur () vs subscribe () pour définir une propriété de classe

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);
  }
}
18
bulforce

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’un subscribe sur l’observable. Si l'observable renvoyé par do 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 que subscribe.

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.

20
vince

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)
  );
}
10
mariogl