javascript - Vil RxJS forkJoin returnere resultater i rekkefølge?


RxJS gir en funksjon som heter forkJoin. Den lar deg legge inn flere Observables og vente på at alle skal fullføres. Jeg lurer på om den resulterende arrayen vil inneholde resultatene i samme rekkefølge som rekkefølgen på input-observablene. Hvis den ikke gjør det, hvilken av operatorene bevarer samme rekkefølge? Jeg har sett gjennom dokumentasjonen, men klarte ikke å finne svaret.

Svar #1

Det vil returnere resultater i samme rekkefølge. Som beskrevet i disse offisielle dokumentene.

Godt å nevne at det kun vil sende ut de nyeste verdiene av strømningene:

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]

Svar #2

Anti-svar

For oss som faktisk ønsker å få resultater sortert etter oppgavens fullføringstid, kan du bruke følgende alternativ til 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 one 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>

Relaterte artikler