You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RxJS中forkJoin返回的结果是否与输入Observable的顺序一致?

Hey there! Great question about RxJS's forkJoin — let me clear this up for you straight away:

forkJoin Preserves Input Observable Order

The short answer is yes, the result array returned by forkJoin is always ordered exactly to match the sequence of Observables you pass in. The completion time of each individual Observable doesn't affect this ordering at all.

Example to Prove It

Let's say we have three Observables that finish at different times:

import { forkJoin, of, delay } from 'rxjs';

// Observables finish in reverse order of their input position
const slowObs = of('Slow result').pipe(delay(3000)); // Last to finish
const fastObs = of('Fast result').pipe(delay(1000)); // First to finish
const mediumObs = of('Medium result').pipe(delay(2000)); // Middle to finish

forkJoin([slowObs, fastObs, mediumObs]).subscribe(results => {
  console.log(results); 
  // Output: ["Slow result", "Fast result", "Medium result"]
  // Matches the input order, not completion order!
});

Why This Works

Under the hood, forkJoin tracks each input Observable by its index. As each Observable completes, it stores its final value in a position corresponding to its original input order. Only when all Observables have completed does it emit the fully assembled array.

What If You Needed Alternatives?

Since forkJoin already handles order perfectly, you won't need a different operator for this specific use case. But just for context:

  • zip: Pairs emissions from Observables in order (but it works with every emission, not just the final one like forkJoin).
  • concat: Runs Observables one after another in input order, emitting results as each completes (great if you need sequential execution instead of parallel).

Quick Note

Keep in mind: if any input Observable never completes, forkJoin will never emit a result. If an Observable throws an error, it will terminate the whole forkJoin stream unless you handle errors per-Observable with catchError.

内容的提问来源于stack exchange,提问作者Wouter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:01:37