我有一组观察值,当最后一个提供了一个值(不管是哪个值)时,我需要做出反应。
我的第一个方法是这样的。
const observables = [
this.backend.config(),
this.navigation.location()
];
forkJoin(observables)
.subscribe(([backend, selection]) => {
console.log(backend);
console.log(selection);
});
这在一定程度上是可行的,只要观察到的发射在某一时刻完成(在此基础上,调用终结化。然后我尝试了。这解决了原来的问题,但创造了一个新的问题。现在,只要任何可观察对象的提供,我就会调用最后一个方法。
我希望在每个观察值至少提供一次并且可能已经完成或可能没有完成时调用它。无论它是每一个的最新值还是第一个值都无关紧要。不过,学习如何在+1中控制它可能是一个加号。
我想出的最好的解决方案是检查!!backend和!!导航,只有当它们都满足时才采取行动。我正在寻找一种更平滑的解决方案,或者确认我正在使用的解决方案是最好的。
combineLatest(observables)
.subscribe(([a, b, c]) => {
if (!a || !b || !c)
console.log("Oh, I'm coming...");
else
console.log("Wham, bam - I'm done!");
});
所有这些都来自博客like this或that,posts on SO和Observables' docs。
发布于 2019-03-15 07:59:50
使用zip
而不是forkJoin
。它的工作原理类似,但不需要观察对象来完成。
const a$ = of('a'); // will complete instantly
const b$ = timer(2000).pipe(mapTo('b')); // will complete later
const c$ = new BehaviorSubject('c'); // will never complete
zip(a$, b$, c$).subscribe(console.log) // (after 2s) ['a', 'b', 'c']
https://stackoverflow.com/questions/55148336
复制相似问题