Tengo la función asíncrona handleParamsChanges que puede tardar unos segundos en resolverse. Y lo llamo cuando observable emite valor:
this._activatedRoute.params .subscribe(params => { this.handleParamsChanges(params).then(() => { // new value can be processed now }); }); ¿Cómo podría modificar mi código para que si observable emita 2 valores uno tras otro, primero se llame a handleParamsChanges para el primer valor, y solo después de que se resuelva esta promesa, se llame con el segundo valor, y así sucesivamente?
Editar:
Aquí está la solución que se me ocurrió, pero supongo que hay una mejor manera de hacerlo:
const params$ = this._activatedRoute.params; const canExecute$ = new BehaviorSubject(true); combineLatest(params$, canExecute$) .pipe( filter(([_, canExecute]) => canExecute), map(([params]) => params), distinctUntilChanged() ) .subscribe(async params => { canExecute$.next(false); try { await this.handleParamsChanges(params); } catch (e) { console.log(e); } finally { canExecute$.next(true); } }) Estoy usando canExecute$ para retrasar el procesamiento del nuevo valor.
Necesito usar distinctUntilChanged aquí para evitar crear un bucle infinito.
Lo que estás buscando es concatMap . Espera a que se complete el "observable interno" anterior antes de volver a suscribirse. También puede simplificar enormemente su tubería:
params$.pipe( concatMap(params => this.handleParamsChanges(params)), ).subscribe()