RxJS forkJoin 会按顺序返回结果吗?
Posted
技术标签:
【中文标题】RxJS forkJoin 会按顺序返回结果吗?【英文标题】:Will RxJS forkJoin return results in order? 【发布时间】:2018-08-29 10:32:56 【问题描述】:RxJS 提供了一个名为forkJoin
的函数。它允许您输入多个Observables
并等待它们全部完成。我想知道结果数组是否将包含与输入 observables 顺序相同的结果。如果不是,那么哪个运营商确实保持相同的顺序?我一直在研究docs,但找不到答案。
【问题讨论】:
是的,顺序相同 刚刚浏览了官方文档(reactivex.io/rxjs/class/es6/…)。是的,它将按照相同的顺序。 文档说如下:“forkJoin 将等待所有传递的 Observables 完成,然后它会发出一个数组,其中包含来自相应 Observables 的最后一个值。因此,如果您将 n 个 Observables 传递给操作员,则结果数组将有 n 个值,其中第一个值是第一个 Observable 发出的最后一个值,第二个值是第二个 Observable 发出的最后一个值,依此类推。” 【参考方案1】:它将以相同的顺序返回结果。如these official docs 中所述。
值得一提的是它只会发出流的最新值:
var source = Rx.Observable.forkJoin(
Rx.Observable.of(1,2,3),
Rx.Observable.of(4)
);
source.subscribe(x => console.log("Result", x));
// LOG: Result [3,4]
【讨论】:
这是正确的答案,它提供了示例和文档链接【参考方案2】:反答
对于我们这些真正想要获得按任务完成时间排序的结果的人,您可以使用以下替代 forkJoin
const merge, of = rxjs;
const bufferCount, take, delay = rxjs.operators;
let t1 = of(1).pipe(delay(1000));
let t2 = of(2).pipe(delay(3000));
let t3 = of(3).pipe(delay(4000));
let t4 = of(4).pipe(delay(2000));
// in forkJoin(t1,t2,t3,t4) we get: [1,2,3,4]
// in this we get sorted by finish time: [1,4,2,3]
// bufferCount(4) join 4 results to array
// take(1) take on buffer and unsubscribe after
merge(t1,t2,t3,t4)
.pipe(bufferCount(4), take(1))
.subscribe(console.log)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.5/rxjs.umd.min.js" integrity="sha256-85uCh8dPb35sH3WK435rtYUKALbcvEQFC65eg+raeuc=" crossorigin="anonymous"></script>
【讨论】:
以上是关于RxJS forkJoin 会按顺序返回结果吗?的主要内容,如果未能解决你的问题,请参考以下文章
Angular 7 RxJs - HTTP 调用未在 ForkJoin 中完成
Rxjs:Observable.combineLatest vs Observable.forkJoin
如何在RXJS 6.3.3中使用ForkJoin导入Observer?
使用 switchmap 和 forkjoin 链接 observables 不能按预期工作 angular typescript rxjs