Soy muy nuevo en rxjs y me preguntaba si está bien configurar una propiedad de clase canalizando la transmisión y tocándola, o debería hacerlo en la suscripción. Para mí, de cualquier manera funciona, solo me pregunto si está bien hacerlo como mejor me parezca o si hay algo que desconozco.
Código mecanografiado que demuestra ambas formas:
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(); } }contra
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); } }Buena pregunta. En el código fuente del operador tap , este comentario lo resume bastante bien:
Este operador es útil para depurar sus Observables para obtener los valores correctos o realizar otros efectos secundarios.
Nota: esto es diferente a unasubscribeen el Observable. Si el Observable devuelto pordono está suscrito, los efectos secundarios especificados por el Observador nunca ocurrirán. pordotanto, simplemente espía la ejecución existente, no activa una ejecución como lo hacesubscribe.
Cualquier efecto secundario que pueda ejecutar en un tap probablemente también se pueda colocar en el bloque de subscribe . La subscribe indica su intención de usar activamente el valor de la fuente, ya que dice "cuando este observable emite, quiero guardar su valor en la variable de los applicants ". El operador de tap está allí principalmente para la depuración, pero se puede usar para ejecutar efectos secundarios.
En general, favorezca el bloque de subscribe para ejecutar efectos secundarios, use tap para depurar, pero tenga en cuenta que tap puede hacer más si lo necesita.
tap es útil cuando tienes el observable separado de su suscriptor. Si tiene una clase que expone un observable, puede usar tap para implementar efectos secundarios que esta clase necesita ejecutar cuando alguien está escuchando el observable. Por otro lado, cuando te suscribes desde otra clase, puedes implementar efectos secundarios desde el punto de vista del suscriptor, usando subscribe .
Clase con el 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) ) );Clase con la suscripción:
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) ); }Michael Hladky sugiere que ponga todos los efectos secundarios en el operador del grifo y explica por qué aquí .
Creo que, en general, es una buena idea hacerlo porque, como dice Michael, puede combinar muchos observables y crear una sola suscripción para todos ellos.
No sé si esto mejora el rendimiento o no, pero definitivamente lo hace más fácil cuando desea darse de baja para tener solo una suscripción. Darte de baja es algo que siempre debes hacer para evitar posibles pérdidas de memoria u otros comportamientos extraños.
Otra ventaja de este enfoque es que puede pausar, reanudar o completar fácilmente un grupo de observables al canalizarlo a través de operadores como filter o takeWhile, o cambiarlo a través de otro observable como este:
const allMergedObservables$ = merge(obs1, obs2, obs3); const play$ = new Subject(); play$.asObservable().pipe( switchMap(bool => bool ? allMergedObservables$ : EMPTY) ).subscribe(); // Putting 'true' into the play stream activates allMergedObservables$. play$.next(true); // Something happens that makes you want to pause the application, // for instance the user opens the print dialog box, // so you issue 'false' in the play stream which in turn stops the // inner subscription of allMergedObservables$: play$.next(false);Sin embargo, depende de usted y del estilo de programación que prefiera.