javascript - firebaseapp - Encadenamiento de observables en RxJS
rxjs observable angular 6 (1)
Estoy aprendiendo RxJS y Angular 2. Digamos que tengo una cadena de promesa con múltiples llamadas a funciones asíncronas que dependen del resultado anterior, que se ve así:
var promiseChain = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1);
}, 1000);
}).then((result) => {
console.log(result);
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(result + 2);
}, 1000);
});
}).then((result) => {
console.log(result);
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(result + 3);
}, 1000);
});
});
promiseChain.then((finalResult) => {
console.log(finalResult);
});
Mis intentos de hacer lo mismo usando RxJS sin el uso de promesas produjeron lo siguiente:
var observableChain = Observable.create((observer) => {
setTimeout(() => {
observer.next(1);
observer.complete();
}, 1000);
}).flatMap((result) => {
console.log(result);
return Observable.create((observer) => {
setTimeout(() => {
observer.next(result + 2);
observer.complete()
}, 1000);
});
}).flatMap((result) => {
console.log(result);
return Observable.create((observer) => {
setTimeout(() => {
observer.next(result + 3);
observer.complete()
}, 1000);
});
});
observableChain.subscribe((finalResult) => {
console.log(finalResult);
});
Produce el mismo resultado que la cadena de promesa. Mis preguntas son
-
¿Lo estoy haciendo bien? ¿Hay alguna mejora relacionada con RxJS que pueda hacer al código anterior?
-
¿Cómo consigo que esta cadena observable se ejecute repetidamente? es decir, agregar otra suscripción al final solo produce un 6 adicional, aunque espero que imprima 1, 3 y 6.
observableChain.subscribe ((finalResult) => {console.log (finalResult);});
observableChain.subscribe ((finalResult) => {console.log (finalResult);});
1 3 6 6
Acerca de la composición de promesas frente a Rxjs, ya que esta es una pregunta frecuente, puede consultar una serie de preguntas anteriores sobre SO, entre las cuales:
- Cómo hacer la secuencia de la cadena en rxjs
- RxJS Promise Composition (pasar datos)
- Secuencia RxJS equivalente a promise.then ()?
Básicamente,
flatMap
es el equivalente de
Promise.then
.
Para su segunda pregunta, ¿desea reproducir valores ya emitidos, o desea procesar nuevos valores a medida que llegan?
En el primer caso, verifique el operador
publishReplay
.
En el segundo caso, la suscripción estándar es suficiente.
Sin embargo, es posible que deba tener en cuenta el frío.
vs. dicotomía en caliente dependiendo de su fuente (cf. Observables en
caliente y en frío: ¿hay operadores ''calientes'' y ''fríos''
para una explicación ilustrada del concepto?)