只是想知道Observable.combineLatest
和 之间有什么区别Observable.forkJoin
?据我所知,唯一的区别是forkJoin
期望Observables完成,同时combineLatest
返回最新值。
Answers:
不仅forkJoin
要求完成所有输入可观察值,而且还返回产生单个值的可观察值,该值是输入可观察值产生的最后一个值的数组。换句话说,它等待直到最后一个可观察输入完成,然后生成一个值并完成。
相反,combineLatest
一旦所有输入可观测值都产生了至少一个值,则每次输入可观测值返回时都会返回一个产生新值的Observable。这意味着它可能具有无限值,并且可能无法完成。这也意味着输入可观察值在产生值之前不必完成。
.catch()
,,.onErrorResumeNext()
并且可能包括.retry()
(如果Http调用可能间歇性地失败)。
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)); };
如果您有3个源可观察物,并且它们分别需要5秒钟才能运行,那么将需要15秒钟combineLatest
才能运行。而forkJoin
它们是并行执行的,因此需要5秒钟。
因此,其forkJoin
工作方式更像Promise.all(...)
是不执行命令的地方。
如果有任何可观察的错误,combineLatest
则不会执行-后续的将不会执行,但是forkJoin
它们都在运行。因此combineLatest
,执行可观察值的“序列”并一起收集结果可能很有用。
高级说明:如果源可观测对象已经在“运行”(由其他对象订阅)并且正在使用share
它们-那么您将不会看到此行为。
更高级的注释:CombineLatest将始终为您提供每个来源的最新信息,因此,如果其中一个来源可观察对象发出多个值,您将获得最新信息。它不仅为每个源获取一个值,然后移至下一个。如果需要确保每个可观察.pipe(take(1))
到的源仅获得“下一个可用项”,则可以在将其添加到输入数组时将其添加到可观察到的源。
concat()
了combineLatest()
代码中的行为。在我看来,该Array.prototype.concat
方法不是RxJSconcat
方法。假设我是对的,那么这个答案是误导性的和不正确的,因为combineLatest()
不会按顺序逐个执行可观察项。它与并行执行它们forkJoin()
。不同之处在于产生了多少值,以及源可观测值是否必须完成。
[source].concat(observables)
,假设这就是您在说“combineLatest
内部使用concat
”时的意思。在我看来,您似乎将数组concat与RxJS concat混淆了。后者确实按顺序执行输入的可观察对象,直到它们完成为止。但这并不是combineLatest()
,完全是一个单独的运算符。
combineLatest()
,forkJoin()
两者并行运行。运行下面的代码,两者都输出约5000。 const start = new Date().getTime();
combineLatest([of(null).pipe(delay(5000)), of(null).pipe(delay(5000)), of(null).pipe(delay(5000))]).subscribe(() => console.log(new Date().getTime() - start));
forkJoin([of(null).pipe(delay(5000)), of(null).pipe(delay(5000)), of(null).pipe(delay(5000))]).subscribe(() => console.log(new Date().getTime() - start));
forkJoin-完成所有可观察值后,从每个观察值中发出最后一个发出的值。
CombineLatest-当任何可观察对象发出值时,从每个观察对象发出最新值。
用法非常相似,但是与forkJoin不同,您不应该忘记退订 CombineLatest。
combineLatest()
和forkJoin()
创造可观察到的功能。它们的作用相同,但语法不同。不要混淆combineLatest
从rxjs/operators
哪个是“pipeable”操作。如果您输入的是错误的,将会出错。