node firebaseapp example dev javascript promise reactive-programming rxjs rxjs5

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

  1. ¿Lo estoy haciendo bien? ¿Hay alguna mejora relacionada con RxJS que pueda hacer al código anterior?

  2. ¿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:

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?)