RxJS forkJoin会按顺序返回结果吗?

时间:2018-03-20 14:38:31

标签: javascript typescript rxjs

RxJS提供了一个名为forkJoin的函数。它允许您输入多个Observables并等待所有这些完成。我想知道结果数组是否将包含与输入observable的顺序相同的顺序的结果。如果没有,哪一个运营商确实维持相同的订单?我一直在研究docs并且无法找到答案。

2 个答案:

答案 0 :(得分:7)

它将以相同的顺序返回结果。如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]

答案 1 :(得分:1)

反回答

对于我们这个实际上想要获得按任务完成时间排序的结果的人,您可以使用以下替代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>