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

如何使用NodeJs中的rxjs中的forkjoin进行多次调用,使用NPM请求

java-forkjoin带有返回值