Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

108
Vistas
¿Cómo garantizar que los observables de diferentes componentes estén completos?

Tengo varios componentes en una página, todos los cuales usan observables para obtener datos de API. Paso estos observables a un servicio de carga, que quiero mostrar un cargador desde que se pasa el primer observable hasta que finaliza el último.

Servicio de carga:

 private _loading = new BehaviorSubject<boolean>(false); readonly loading$ = this._loading.asObservable(); showUntilLoadingComplete<T>(observable$: Observable<T>): Observable<T> { return of(null).pipe( tap(_ => this._loading.next(true)), concatMap(_ => observable$), finalize(() => this._loading.next(false)) ); }

Mis componentes luego llaman al servicio de carga así:

 this.loadingService.showUntilLoadingComplete(someObservable$) .subscribe(data=> { // do stuff });

Sin embargo, debido a la primera finalización observable, el sujeto de comportamiento pasa falso y esto a su vez evita que el cargador se muestre. He considerado crear otro sujeto de comportamiento para almacenar una matriz de los observables activos, y eliminarlos de aquí una vez finalizados, y luego suscribirme a eso y desactivar el cargador una vez que la matriz no tenga longitud. Pero esto no parece una gran solución, así que estoy buscando la opinión de otros.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Dado que depende de la misma loading$ Observable en un servicio único, puede agregar otra propiedad para reflejar el número active de llamadas, luego desactivar la loading solo si no hay otra llamada activa.

Prueba algo como lo siguiente:

 private _active: number = 0; private _loading = new BehaviorSubject<boolean>(false); readonly loading$ = this._loading.asObservable(); showUntilLoadingComplete<T>(observable$: Observable<T>): Observable<T> { return of(null).pipe( tap(() => { this._loading.next(true); this._active++; }), concatMap((_) => observable$), finalize(() => { this._active--; if (!this._active) { this._loading.next(false); } }) ); }
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda