javascript - Kommer RxJS forkJoin att returnera resultat i ordning?
RxJS tillhandahåller en funktion som kallas forkJoin. Den låter dig mata in flera Observables och vänta på att alla ska bli färdiga. Jag undrar om den resulterande arrayen kommer att innehålla resultaten i samma ordning som ordningen på de inskickade observables. Om den inte gör det, vilken av operatorerna behåller samma ordning? Jag har tittat i dokumentationen men kunde inte hitta svaret.
Svar #1
Det kommer att returnera resultat i samma ordning. Som det beskrivs i dessa officiella dokument.
Bra att nämna att det kommer att sända endast de senaste värdena av strömmarna:
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
För oss som faktiskt vill få resultat sorterade efter uppgiftens sluttid kan du använda följande alternativ till 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>