我正从Promise世界转向Observable世界。我通常用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));
然后我有三个可以向控制台发出不同值的observable。如何链接它们以便这三个可观察量按顺序运行并打印1-2-3-4
?
答案 0 :(得分:34)
如果您想确保排放顺序与指定源Observable的顺序相同,则可以使用concat
或concatMap
运算符。
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
立即订阅所有Observables / Promises并在结束时重新提交结果:
merge(printLog1, printLog23, printLog4);
2019年1月:更新了RxJS 6