Rxjs:Observable.combineLatest vs Observable.forkJoin

时间:2017-01-22 23:47:00

标签: rxjs rxjs5

想知道Observable.combineLatestObservable.forkJoin之间的区别是什么?据我所知,唯一的区别是forkJoin期望Observables完成,而combineLatest返回最新值。

3 个答案:

答案 0 :(得分:81)

forkJoin不仅需要完成所有输入可观察量,而且还返回一个observable,它生成一个值,该值是输入observable产生的最后一个值的数组。换句话说,它等待直到最后一个输入observable完成,然后产生一个值并完成。

相反,combineLatest返回一个Observable,一旦所有输入的observable产生了至少一个值,每次输入observable都会产生一个新值。这意味着它可能具有无限值并且可能无法完成。这也意味着输入可观察量不必在产生值之前完成。

答案 1 :(得分:6)

也:

combineLatest(...)依次运行可观察对象

combineLatest内部使用concat,这意味着在移动到下一个数组之前必须为数组中的每个可观察值获取一个值。

// partial source of static combineLatest (uses the rxjs/operators combineLatest internally):
// If you're using typescript then the output array will be strongly typed based on type inference
return function (source) { return source.lift.call(from_1.from([source].concat(observables)), 
                           new combineLatest_1.CombineLatestOperator(project)); };

forkJoin(...)同时并行运行可观察对象

如果您有3个源可观测对象,并且它们分别需要5秒钟才能运行,那么combineLatest将需要15秒钟才能运行。 forkJoin是并行执行的,因此需要5秒钟。

因此,forkJoin的工作方式与Promise.all(...)有点类似,其中不执行订单。

有关错误处理的注意事项:

如果有任何可观察到的错误-使用combineLatest,后续的将不会执行,但是使用forkJoin,它们将全部运行。因此,combineLatest对执行可观察变量的“序列”并一起收集结果很有用。


高级说明:如果源可观测对象已经在“运行”(由其他对象订阅),并且您在它们上使用了share-那么您将不会看到此行为。

甚至更高级的注释:CombineLatest始终会为您提供每个来源的最新信息,因此,如果其中一个来源可观察对象发出多个值,您将获得最新信息。它不仅为每个来源获取一个值,然后移至下一个。如果需要确保每个可观察到的源仅获得“下一个可用项”,则可以在将.pipe(take(1))添加到可观察到的源时将其添加到输入数组。

答案 2 :(得分:0)

forkJoin -完成所有可观察对象后,从每个观察对象中发出最后一个发出的值。

combineLatest -当任何可观察对象发出一个值时,请从每个观察对象中发出最新的值。

用法非常相似,但与 forkJoin 不同,您不应该忘记退订 combineLatest