RxJS中的链接可观察量

Har*_*aka 57 javascript reactive-programming promise rxjs rxjs5

我正在学习RxJS和Angular 2.假设我有一个带有多个异步函数调用的promise链,它取决于前一个的结果,如下所示:

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);
});
Run Code Online (Sandbox Code Playgroud)

我在不使用promise的情况下单独使用RxJS的尝试产生了以下结果:

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);
});
Run Code Online (Sandbox Code Playgroud)

它产生与promise链相同的输出.我的问题是

  1. 我这样做了吗?我是否可以对上述代码进行任何与RxJS相关的改进

  2. 如何让这个可观察的链重复执行?即在最后添加另一个订阅只会产生额外的6,但我希望它打印1,3和6.

    observableChain.subscribe((finalResult)=> {console.log(finalResult);});

    observableChain.subscribe((finalResult)=> {console.log(finalResult);});

    1 3 6 6

use*_*222 42

关于承诺组合与Rxjs,因为这是一个经常被问到的问题,你可以参考SO上的一些先前提出的问题,其中包括:

基本上,flatMap相当于Promise.then.

对于第二个问题,是否要重播已发出的值,或者是否要在到达时处理新值?在第一种情况下,检查publishReplay操作员.在第二种情况下,标准订阅就足够了.但是你可能需要注意感冒.与热的二分法相比,取决于你的来源(参见Hot and Cold observables:有'热'和'冷'操作符?对于概念的说明性解释)

  • flatMap 在 RXJs 6+ 中已弃用,请改用 mergeMap (3认同)