firebaseapp dev compat rxjs rxjs5

dev - Rxjs: Observable.combineLatest vs Observable.forkJoin



rxjs pipe (3)

Me pregunto cuáles son las diferencias entre Observable.combineLatest y Observable.forkJoin . Hasta donde puedo ver, la única diferencia es forkJoin espera que los Observables se completen, mientras combineLatest devuelve los últimos valores.


También:

combineLatest (...) ejecuta observables en secuencia, uno por uno

combineLatest utiliza internamente concat , lo que significa que se debe obtener un valor para cada observable en la matriz antes de pasar al siguiente.

// partial source of static combineLatest (uses the rxjs/operators combineLatest internally): // If you''re using typescript then the output array will be strongly typed based on type inference return function (source) { return source.lift.call(from_1.from([source].concat(observables)), new combineLatest_1.CombineLatestOperator(project)); };

forkJoin (...) ejecuta observables en paralelo, al mismo tiempo

Si tiene 3 observables de origen, y cada uno de ellos tarda 5 segundos en ejecutarse, se tardará 15 segundos en combineLatest . Mientras que forkJoin se ejecutan en paralelo, por lo que tomará 5 segundos.

Entonces forkJoin funciona más como Promise.all(...) donde el orden no se aplica.

Consideración para el manejo de errores:

Si alguno de los errores observables combineLatest con combineLatest los siguientes no se ejecutarán, pero con forkJoin se están ejecutando. Entonces combineLatest puede ser útil para ejecutar una ''secuencia'' de observables y recolectar el resultado todos juntos.

Nota avanzada: si los observables de origen ya están ''en ejecución'' (suscritos por otra cosa) y está utilizando share en ellos, entonces no verá este comportamiento.

Nota aún más avanzada: CombineLatest siempre le dará lo último de cada fuente, por lo que si uno de los observables de la fuente emite múltiples valores, obtendrá la última. No solo obtiene un valor único para cada fuente y pasa a la siguiente. Si necesita asegurarse de que solo obtiene el ''próximo elemento disponible'' para cada fuente observable, puede agregar .pipe(take(1)) a la fuente observable a medida que lo agrega a la matriz de entrada.


forkJoin no forkJoin requiere que se forkJoin todos los observables de entrada, sino que también devuelve un observable que produce un solo valor que es una matriz de los últimos valores producidos por los observables de entrada. En otras palabras, espera hasta que se complete la última entrada observable, y luego produce un solo valor y se completa.

En contraste, combineLatest devuelve un Observable que produce un nuevo valor cada vez que lo hacen los observables de entrada, una vez que todos los observables de entrada han producido al menos un valor. Esto significa que podría tener valores infinitos y puede que no se complete. También significa que los observables de entrada no tienen que completarse antes de producir un valor.


forkJoin : cuando se completan todos los observables, emite el último valor emitido de cada uno.

combineLatest : cuando cualquier observable emite un valor, emita el último valor de cada uno.

El uso es bastante similar, pero no debes olvidar darte de baja de combineLatest a diferencia de forkJoin .