修改RxJS的combineLatest行为:无需等待所有Observable发射即可输出
解决RxJS combineLatest需等待全部Observable发射才触发的问题
你遇到的是combineLatest的固有特性:它需要所有源Observable都至少发射一次值后,才会触发订阅回调,之后每次任意源Observable发射新值时才会再次触发。根据你的需求,分两种场景给出解决方案:
场景1:每次单个Observable发射时,输出所有Observable的最新值(含未发射过的用默认值填充)
给每个Observable添加startWith操作符,设置对应控件的初始值(比如控件当前的初始状态),这样combineLatest一开始就能获取到所有源的初始值,后续任意控件变化都会立即触发回调:
combineLatest( this.controls.toArray().map(c => c.changeEvent.asObservable().startWith(c.value) // 用控件初始值作为默认发射值 ) ).subscribe(x => { console.log(x); });
场景2:仅需单个Observable发射时,输出该Observable的单独值
如果不需要获取所有控件的最新值,只关心单个控件的变化事件,直接用merge操作符合并所有Observable,它会在任意源Observable发射值时立即触发回调:
merge( ...this.controls.toArray().map(c => c.changeEvent.asObservable()) ).subscribe(x => { console.log(x); // 输出单个变化控件的事件值 });
内容的提问来源于stack exchange,提问作者Sergino
相关产品推荐
相关产品推荐

