RxJS中的链接可观察对象


70

我正在学习RxJS和Angular2。比方说,我有一个带有多个异步函数调用的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);
});

我仅使用RxJS而不使用promises的尝试产生了以下结果:

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);
});

它产生与承诺链相同的输出。我的问题是

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

  2. 如何获得可重复观察的链条?即在最后添加另一个订阅只会产生额外的6,尽管我希望它可以打印1、3和6。

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

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

    1 3 6 6


在此处提供了使用rxjs6链接诺言的可行示例:stackoverflow.com/a/55991374/1882064
arcseldon

Answers:


53

关于promise composition vs. Rxjs,因为这是一个常见问题,因此您可以参考一些先前关于SO的问题,其中:

基本上flatMap等于Promise.then

对于第二个问题,您是要重放已经发出的值,还是要在到达新值时对其进行处理?在第一种情况下,请检查publishReplay操作员。在第二种情况下,标准订阅就足够了。但是,您可能需要注意感冒。vs.热二分法,具体取决于您的来源(请参见“热和冷可观察物:是否存在”热”和“冷”运算符?以对该概念进行图解说明)


在RXJs 6+中已不推荐使用flatMap,请改用mergeMap
user3929590
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.