angular - example - rxjs pipe
Promise.all() con RxJS (4)
Como señaló @Eric Martinez, hay forkJoin . forkJoin ejecuta todas las secuencias observables en paralelo y recoge sus últimos elementos.
Rx.Observable.forkJoin([a,b]).subscribe(t=> {
var firstResult = t[0];
var secondResult = t[1];
});
Estoy escribiendo una aplicación en Angular 2 y quiero ejecutar varias solicitudes http y ejecutar una función en las respuestas.
En Angular 1, escribiría algo como $q.all([$http.get(...), $http.get(...), ...]).then(doSomethingWithResponses);
Pero Angular 2 devuelve RxJS Observables y después de un montón de lecturas todavía no puedo entender cómo obtener las respuestas de varias solicitudes http. ¿Cómo puede hacerse esto?
No estoy seguro de que quiera usar forkJoin/zip
, especialmente considerando que combineLatest
es más fácil de entender y emitirá en cada evento secundario, mientras que forkJoin
básicamente muestrea en cada forkJoin
que ha emitido.
Esto podría llegar a morderte más tarde cuando quieras combinar los Observables de múltiples ítems más adelante.
Estoy aprendiendo RxJS y estaba tratando de hacer lo mismo con RxJS v5
Parece que ya no tenemos forkJoin
en v5, así es como lo hice funcionar (funciona con flatMap
o mergeMap
, que son alias):
const callOne = value =>
new window.Promise(resolve =>
setTimeout(() => resolve(value + 10), 3000)
);
const callTwo = value =>
new window.Promise(resolve =>
setTimeout(() => resolve(value + 20), 1000)
);
Rx.Observable
.of(2)
.do(() => console.log(''querying...''))
.mergeMap(number =>
Rx.Observable.zip(
Rx.Observable.fromPromise(callOne(number)),
Rx.Observable.fromPromise(callTwo(number))
)
).concatAll()
.subscribe(createSubscriber(''promises in parallel''));
¿No funcionaría una merge
? Puede suscribirse y adjuntar un controlador a la onComplete
llamada completa.
Primero construyo una matriz de mis observables y luego uso la merge
estática:
let obs_ary: any = [obs1, obs2, obs3];
Observable.merge(...obs_ary);