【发布时间】:2020-02-12 22:36:56
【问题描述】:
通常,在 Angular 应用程序中,我有一些服务,需要通过 http 请求检索一些数据并通过 BehaviorSubject 将其共享给消费者。它有这样的实现:
class Service {
private data = new BehaviorSubject();
getData() {
if (!this.data.getValue()) {
anyHttpCall().subscribe(res => this.data.next(res));
}
return this.data.asObservable();
}
}
这种方法的主要问题是当应用程序的某些组件在还没有值的情况下同时调用getData()时,会触发多次http调用和数据发射,所以我找到了2种方法来防止它:
1)存储表示请求状态的布尔变量
class Service {
private data = new BehaviorSubject();
private pendingResult = false;
getData() {
if (!this.data.value && !this.pendingResult) {
this.pendingResult = true;
anyHttpCall().subscribe(res => {
this.data.next(res);
this.pendingResult = false;
}
}
return this.data.asObservable();
}
}
2)在服务构造函数中获取数据
class Service {
private data = new BehaviorSubject();
constructor() {
anyHttpCall().subscribe(resthis.data.next(res));
}
getData() {
return this.data.asObservable();
}
}
那么哪种方法或其他方法是最好的以及为什么
【问题讨论】:
-
你看过 NgRx 库吗?它处理状态管理、数据共享和组件通信:github.com/ngrx/platform/blob/master/docs/store/README.md
标签: angular