Tengo un problema con los observables. He preparado stackblitz para simplificar mi problema.
Tengo 2 observables (obs1$, obs2$) y una matriz de números. Quiero esperar a que se complete obs1 $ y luego recorrer la matriz y devolver el observable de cada elemento, ejecutar obs2 $.
Aquí está el código de la función:
oneByOneObservables(): Observable<unknown> { const obs1$ = of(1, 2, 3); const arr = [4, 5, 6]; const obs2$ = of(7, 8, 9); return obs1$.pipe( concat(() => arr.map((item) => of(item))), () => obs2$ ); }Tengo un error:
Ninguna sobrecarga coincide con esta llamada. La última sobrecarga dio el siguiente error. El argumento de tipo '() => Observable[]' no se puede asignar al parámetro de tipo 'SchedulerLike | Entrada observable'. Falta la propiedad '[Symbol.iterator]' en el tipo '() => Observable[]' pero se requiere en el tipo 'Iterable'.
Gracias por la ayuda
Así que esto hará el truco. Agregué algunos registros para rastrearlo.
Aquí también está Stackblitz .
import { Component } from '@angular/core'; import { ChangeDetectionStrategy } from '@angular/core'; import { Observable, of, forkJoin } from 'rxjs'; import { concatMap, tap, last } from 'rxjs/operators'; @Component({ selector: 'my-app', styleUrls: ['./app.component.scss'], templateUrl: './app.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }) export class AppComponent { oneByOneObservables(): Observable<unknown> { const obs1$ = of(1, 2, 3).pipe(tap((v) => console.log('Obs1', v))); const arr = [4, 5, 6]; const obs2$ = of(7, 8, 9); return obs1$.pipe( last(), tap((v) => console.log('Obs1 last value', v)), concatMap(() => forkJoin(arr.map((item) => of(item)))), tap((v) => console.log('Array of observables value', v)), concatMap(() => obs2$), tap((v) => console.log('Obs2 value', v)) ); } }Aquí hay algo de código:
function oneByOneObservables(): Observable<number> { const obs1$ = of(1, 2, 3); const arr = [4, 5, 6]; const obs2$ = of(7, 8, 9); return obs1$.pipe( concatWith(defer(() => { arr.map((item) => of(item)) return obs2$ })) ); } oneByOneObservables().subscribe(console.log);producción:
1 2 3 7 8 9Un ejemplo en el que se suscribe a la matriz de observables uno tras otro.
function oneByOneObservables(): Observable<number> { const obs1$ = of(1, 2, 3); const arr = [4, 5, 6]; const obs2$ = of(7, 8, 9); return obs1$.pipe( concatWith(defer(() => concat(...arr.map((item) => of(item))) )), concatWith(obs2$) ); } oneByOneObservables().subscribe(console.log)producción:
1 2 3 4 5 6 7 8 9¿Puedes usar switchMap? Aunque no estoy seguro de qué salida de los observables está buscando.
oneByOneObservables(): Observable<unknown> { const obs1$ = of(1, 2, 3); const arr = [4, 5, 6]; const obs2$ = of(7, 8, 9); return obs1$.pipe( concat(() => arr.map((item) => of(item))), switchMap(() => obs2$) ); }