Rxjs 如何强制观察对象按顺序执行?

Rxjs 如何强制观察对象按顺序执行?,rxjs,rxjs5,Rxjs,Rxjs5,我正在从应许的世界走向可观察的世界。我通常使用Promise做的一件事是将一系列任务链接起来,并使它们按顺序运行。例如,我有三个任务:printLog1()将1打印到控制台,printLog23()将2和3打印到控制台,以及printLog4()打印4 当我想打印1-2-3-4时,我会写一个承诺链,如 printLog1() .then(() => { printLog23(); }) .then(() => { printLog4(); }); 现

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

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

printLog1()
  .then(() => {
    printLog23();
  })
  .then(() => {
    printLog4();
  });
现在,我需要与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));

然后,我有三个观察对象,它们向控制台发出不同的值。我如何将它们链接起来,以便这三个观测值按顺序运行并打印
1-2-3-4

如果您想确保排放顺序与您指定源观测值的顺序相同,您可以使用
concat
concatMap
操作符

concat*
操作符仅在前一个可观察对象完成后才订阅该可观察对象(它也适用于承诺,请参阅)

在您的情况下,它将如下所示:

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

concat(printLog1, printLog23, printLog4);
。。。或者,如果一个承诺的请求取决于前一个承诺的响应,则使用
concatMap

printLog1.pipe(
  concatMap(response => ...),
  concatMap(response => ...),
);
。。。或者,当顺序无关紧要时,您可以使用
merge
立即订阅所有可观察/承诺,并在结果到达时重新提交结果:

merge(printLog1, printLog23, printLog4);

2019年1月:为RxJS 6更新了

我测试了这个方法,测试的行是
const$printLog1=from(someFunc1Async())
const$printLog2=from(someFunc2Async())
,然后尝试使用concat失败。上面带有
from
的赋值会立即导致调用。。也许很明显,但希望能帮助别人。嘿!谢谢我对两个观测值进行了
合并
,得到了两个响应,但我不知道哪一个是针对哪一个的。有什么办法吗?我不认为本例中管道中的
concatMap
是绝对必要的-可以使用
mergeMap
获得相同的结果。每次调用
printLog1
时,它都会返回一个新的可观察对象,随后的每个映射操作符都将是一个新的调用-因此没有内部可观察对象可取消。如果映射位于主题的
管道中,并且调用了
printLogSubject.next()
,则使用
concatMap
是有意义的