【问题标题】:Will RxJS forkJoin return results in order?RxJS forkJoin 会按顺序返回结果吗?
【发布时间】:2018-08-29 10:32:56
【问题描述】:

RxJS 提供了一个名为forkJoin 的函数。它允许您输入多个Observables 并等待它们全部完成。我想知道结果数组是否将包含与输入 observables 顺序相同的结果。如果不是,那么哪个运营商确实保持相同的顺序?我一直在研究docs,但找不到答案。

【问题讨论】:

  • 是的,顺序相同
  • 刚刚浏览了官方文档(reactivex.io/rxjs/class/es6/…)。是的,它将按照相同的顺序。
  • 文档说如下:“forkJoin 将等待所有传递的 Observables 完成,然后它会发出一个数组,其中包含来自相应 Observables 的最后一个值。因此,如果您将 n 个 Observables 传递给操作员,则结果数组将有 n 个值,其中第一个值是第一个 Observable 发出的最后一个值,第二个值是第二个 Observable 发出的最后一个值,依此类推。”

标签: javascript typescript rxjs 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>

【讨论】:

    猜你喜欢
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    相关资源
    最近更新 更多