如何强制可观察对象按顺序执行?
How to force observables to execute in sequence?
我正在从 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
?
如果您想确保发射的顺序与指定源 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 更新
我正在从 Promise 世界转移到 Observable 世界。我通常使用 Promise 做的一件事是将一系列任务链接起来,并使它们按顺序排列 运行。例如,我有三个任务:printLog1()
打印 1 到控制台,printLog23()
打印 2 和 3 到控制台,printLog4()
打印 4。
当我想打印 1-2-3-4 时,我会写一个类似
的承诺链printLog1()
.then(() => {
printLog23();
})
.then(() => {
printLog4();
});
现在我想要与 Observable 相同的功能,我可以将 printLog()
函数重写成一个像
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
?
如果您想确保发射的顺序与指定源 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 更新