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 .