如何强制observable按顺序执行?

Hao*_* Yu 24 rxjs rxjs5

我正在从Promise世界转向Observable世界.我通常用Promise做的一件事就是将一系列任务链接起来并使它们按顺序运行.例如,我有三个任务:printLog1()打印1到控制台,printLog23()打印2和3到控制台,printLog4()打印4.

当我想打印1-2-3-4时,我会写一个类似的承诺链

printLog1()
  .then(() => {
    printLog23();
  })
  .then(() => {
    printLog4();
  });
Run Code Online (Sandbox Code Playgroud)

现在我想要与Observable相同的功能,我可以将printLog()函数重写为Observable

printLog1 = Rx.Observabale.of(1).map((i) => console.log(i));
printLog23 = Rx.Observabale.of(2, 3).map((i) => console.log(i));
printLog4 = Rx.Observabale.of(4).map((i) => console.log(i));
Run Code Online (Sandbox Code Playgroud)

然后我有三个observable,它们向控制台发出不同的值.如何链接它们以便这三个可观察量按顺序运行并打印1-2-3-4

mar*_*tin 38

如果要确保排放顺序与您指定可使用的源Observables的顺序相同concatconcatMap运算符.

concat*运营商只有以前的可观测结束(它的工作原理与承诺还有,看后请订阅可观察http://reactivex.io/rxjs/class/es6/MiscJSDoc.js~ObservableInputDoc.html).

在你的情况下,它看起来像以下:

import { concat } from 'rxjs'; // Note, concat from 'rxjs', is not the same as concat from 'rxjs/operators'

concat(printLog1, printLog23, printLog4);
Run Code Online (Sandbox Code Playgroud)

......或者concatMap如果一个承诺的请求取决于之前的承诺的响应:

printLog1.pipe(
  concatMap(response => ...),
  concatMap(response => ...),
);
Run Code Online (Sandbox Code Playgroud)

......或者当订单无关紧要时,您可以merge立即订阅所有Observables/Promises,并在收到时重新提交结果:

merge(printLog1, printLog23, printLog4);
Run Code Online (Sandbox Code Playgroud)

2019年1月:更新了RxJS 6