我们在某些服务中有一个行为主题
city = new BehaviorSubject(config.defaultCity);
get cityObservable(){
return this.city.asObservable();
}
当我们在某些组件中获得可观察值时,我们可以侦听值的变化,从而根据城市获取不同的数据。
像这样
categories: Observable<any>;
activeCoupons: Observable<any>;
ngOnInit() {
this.categories = this.utilsService.cityObservable
.pipe(
debounceTime(100),
switchMap(cityId => this.categoryService.fetchCategories(cityId)),
map((response: any) => response.data)
);
this.activeCoupons = this.utilsService.cityObservable
.pipe(
debounceTime(100),
switchMap(cityId => this.couponService.fetchActiveCoupons(cityId))
);
}
问题在于,fetchCategories
在城市价值变化时被调用一次,fetchActiveCoupons
在城市价值变化时被调用两次!为什么它的价值两次发出?他们没有相同的代码吗?
答案 0 :(得分:3)
问题在于,当城市价值更改时,fetchCategories被调用一次,而当城市价值更改时,fetchActiveCoupons被调用两次。
它被调用两次,因为它有两个订阅者。
您可以共享可观察对象并使用shareReplay()
重播以前的值 this.activeCoupons = this.utilsService.cityObservable
.pipe(
debounceTime(100),
switchMap(cityId => this.couponService.fetchActiveCoupons(cityId)),
shareReplay(1)
);
当您有大量可观察的内容并希望与多个订阅者共享结果,或者希望晚订阅者接收以前的值时,可以使用shareReplay()
。