异步服务的常见模式是将共享资源设为Subject()或ReplaySubject()。这样,你只需连接用户,他们就可以很好地等待数据的到来。
在您的示例中,它对资源进行切片,因此这是一个映射操作符(正如您已经做的那样)。还有一种方法可以发出回迁信号
起动
(不在乎它是否已经完成,因为它是可以观察到的)。
@Injectable()
export class StaticResourcesService {
private resourcesTree$ = new ReplaySubject(1);
private status = 'unloaded';
getSpecificLabel(resourceName: string, type: string): Observable<string> {
if( this.status === 'unloaded') {
this.status = 'loading';
getResources();
}
return resourcesTree$.map(resources => {
return jp.value(resources, `$.${resourceName}[?(@.type=="${type}")].label`);
});
}
private getResources(): Observable<any> {
this.getResourcesFilePath() // get obs<string> with a file path
.mergeMap(path => {
console.log(`static-resources path: ${path}`);
return this.http.get(path).map(res => res.json()); // get json obj
})
.subscribe(res => {
this.resourcesTree$.next(res);
this.status = 'loaded';
});
}