只是想知道Observable.combineLatest
和 之间的区别是什么Observable.forkJoin
?据我所知,唯一的区别是forkJoin
期望Observables完成,同时combineLatest
返回最新的值.
不仅forkJoin
需要完成所有输入可观察量,而且还返回一个observable,它生成一个值,该值是输入observable产生的最后一个值的数组.换句话说,它等待直到最后一个输入observable完成,然后生成一个值并完成.
相反,combineLatest
一旦所有输入的observable都产生了至少一个值,则返回一个Observable,每次输入observable都会生成一个新值.这意味着它可能具有无限值并且可能无法完成.它还意味着输入observable不必在生成值之前完成.
也:
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)); };
如果您有3个源可观察物,并且它们分别需要5秒钟才能运行,那么将需要15秒钟combineLatest
才能运行。而forkJoin
它们是并行执行的,因此需要5秒钟。
因此,其forkJoin
工作方式更像Promise.all(...)
是不执行命令的地方。
如果有任何可观察到的错误,combineLatest
那么后续的将不会执行,但forkJoin
它们都将运行。因此combineLatest
,执行可观察值的“序列”并一起收集结果可能很有用。
高级说明:如果源可观测对象已经在“运行”(由其他对象订阅)并且正在使用share
它们-那么您将不会看到此行为。
更高级的注释:CombineLatest将始终为您提供每个来源的最新信息,因此,如果其中一个来源可观察对象发出多个值,您将获得最新信息。它不仅为每个来源获取一个值,然后移至下一个。如果需要确保每个可观察.pipe(take(1))
到的源仅获得“下一个可用项目”,则可以在将其添加到输入数组时将其添加到可观察到的源。