Combine Latest:如何单次订阅同一Observable获取原始值与计算值
解决方案:单次订阅Observable并同时获取原始值与计算值
你可以通过在firstObs$的管道内同时保留原始值和计算后的sumFromValues,避免重复订阅firstObs$。具体做法是先用switchMap计算出求和结果,再把原始值和求和结果打包成一个对象,之后再和anotherObservable$组合。
示例代码如下:
this.firstObs$.pipe( switchMap(values => this.observableSumOperation(values.first, values.second).pipe( // 将原始值和求和结果合并 map(sumFromValues => ({ values, sumFromValues })) ) ), // 和另一个Observable组合(RxJS 7+推荐写法) combineLatestWith(this.anotherObservable$) ).subscribe(([{ values, sumFromValues }, anotherValues]) => { // 在这里直接使用三个目标值 console.log(values, sumFromValues, anotherValues); });
关键说明:
- 全程仅订阅一次
firstObs$,所有后续操作都基于这次订阅的数据流,不会触发重复调用 - 通过
switchMap调用求和操作后,用map把原始值和求和结果打包,确保两者能同步传递 - 若你使用RxJS 6或更早版本,可改用传统
combineLatest写法:
combineLatest([ this.firstObs$.pipe( switchMap(values => this.observableSumOperation(values.first, values.second).pipe( map(sumFromValues => ({ values, sumFromValues })) ) ) ), this.anotherObservable$ ]).subscribe(([{ values, sumFromValues }, anotherValues]) => { // 处理数据逻辑 });
这种写法同样只生成一个firstObs$的订阅实例,避免了重复触发问题。
内容的提问来源于stack exchange,提问作者Mat
相关产品推荐
相关产品推荐

