【发布时间】:2020-04-22 21:49:36
【问题描述】:
我有一个服务,它使用 Observable 在它的构造函数中加载一些数据。然后在稍后的某个时间,可以使用 getter 检索数据。如果数据存在,它应该立即返回数据。或者,如果仍在进行中,请等待加载完成。我想出了以下示例(代码在 Typescript 中):
class MyService {
private loadedEvent = new Subject<any>();
private loaded = false;
private data: any;
constructor(
private dataService: DataService
) {
this.dataService.loadData().subscribe(data => {
this.data = data;
this.loaded = true;
this.loadedEvent.next(null);
});
}
public getDataOrWait(): Observable<any> {
if (this.loaded) { // A
return of(this.data);
}
return new Observable((observer: Observer<any>) => {
const subscription = this.loadedEvent.subscribe(() => { // B
observer.next(this.data);
observer.complete();
subscription.unsubscribe();
});
});
}
}
有没有更简单的方法来做到这一点?这一定是一种常见的模式。
另外,我认为如果在标记为 A 和 B 的行之间的某处执行加载完成,则存在竞争条件(我不确定此处是否涉及线程 - 但是数据是异步加载的)。
【问题讨论】:
标签: angular typescript rxjs