rxjs - 如何强制可观察对象按顺序执行?

标签 rxjs rxjs5

我正在从无极世界过渡到可观察世界。我通常对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

最佳答案

如果要确保发射顺序与指定源Observable的顺序相同,可以使用concatconcatMap运算符。

concat*运算符仅在上一个Observable完成后才订阅Observable(它也与Promises一起使用,请参见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);


...或使用concatMap如果对一个Promise的请求取决于先前Promise的响应:

printLog1.pipe(
  concatMap(response => ...),
  concatMap(response => ...),
);


...或者顺序无关紧要时,您可以使用merge立即订阅所有Observable / Promise,并在到达时重新发出其结果:

merge(printLog1, printLog23, printLog4);


2019年1月:已针对RxJS 6更新

关于rxjs - 如何强制可观察对象按顺序执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43336549/

相关文章:

angular - 为什么 Observable 变量在 Angular 中没有实时更新?

javascript - Rx distinctUntilChanged 允许在事件之间的可配置时间后重复

javascript - 如何使用 RxJS 显示一个 "user is typing"指标?

rxjs - 如何将Observable转换为ReplaySubject?

angular - switchMap 类型 void 不可分配给类型 ObservableInput<{}>

angular - 我可以将 async/await Promises 与可观察的 RXJS 混合使用吗?

angular - 合并在 RxJS/Angular 6 中相互依赖的不同 HTTP 调用

rxjs - 当内部可观察完成时,switchMap 似乎没有完成

javascript - rxjs中的延迟是什么意思?

angular - 在自动保存场景中以何种顺序使用哪些 rxjs 运算符