我正在从无极世界过渡到可观察世界。我通常对Promise所做的一件事是将一系列任务链接在一起并使它们按顺序运行。例如,我有三个任务:printLog1()
打印1到控制台,printLog23()
打印2和3到控制台,以及printLog4()
打印4。
当我想打印1-2-3-4时,我会写一个像
printLog1()
.then(() => {
printLog23();
})
.then(() => {
printLog4();
});
现在,我希望具有与Observable相同的功能,并且可以将
printLog()
函数重写为ObservableprintLog1 = 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的顺序相同,可以使用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
立即订阅所有Observable / Promise,并在到达时重新发出其结果:merge(printLog1, printLog23, printLog4);
2019年1月:已针对RxJS 6更新
关于rxjs - 如何强制可观察对象按顺序执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43336549/