【发布时间】:2019-09-15 10:16:14
【问题描述】:
这可能是一个菜鸟问题,但我可以找到它的参考。
我有两个组件放置在不同的地方,每个组件都使用一个服务来查询端点并获取一些数据(例如用户配置文件)。
服务返回一个 observable,我需要 observable 是唯一的,或者至少要发出一个唯一的请求。
// Service, shared across multiple components
@Injectable()
export class SomeService {
getData(): Observable<DataModel> {
return this._http.get<DataResponse>('/some-route').pipe(
map((response: DataResponse) => this.handleResponse(response)),
share() // is this right ?
);
}
}
// Component requesting data
@Component({ selector: '...', ... })
export class FirstComponent implements OnInit {
constructor(private _service: SomeService) { }
ngOnInit() {
this._service.getData().subscribe(
data => {
console.log(data);
}
);
}
}
// Another component requesting the same data
@Component({ selector: '...', ... })
export class SecondComponent implements OnInit {
constructor(private _service: SomeService) { }
ngOnInit() {
this._service.getData().subscribe(
data => {
console.log(data);
}
);
}
}
该服务工作并获取数据,但请求发送了两次,我只希望发送一个请求。这些组件同时存在(假设一个在屏幕顶部,第二个在屏幕底部)。所以他们同时提出请求。
有没有办法让服务只发送一个请求。
顺便说一句,第一个请求的状态为 200,第二个请求的状态为 304。
谢谢。
更新
可能的解决方案
到目前为止,我通过添加一个服务变量来管理
private _observable: Observable<DataModel>;
那么当获取数据时
getData(): Observable<DataModel> {
if (!this._observable) {
this._observable = this._http.get<DataResponse>('/some-route').pipe(
map((response: DataResponse) => this.handleResponse(response)),
// HERE IS THE TRICK
publishLast(),
refCount()
)
}
return this_observable;
}
诀窍是使用 publishLast 和 refCount
有更好的方法/想法吗?
【问题讨论】:
-
如果你是菜鸟 - 看看我为 RxJS 初学者准备的视频课程:packtpub.com/web-development/hands-rxjs-web-development-video
标签: angular rxjs angular7 rxjs6