gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:38:00 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com