我正在使用角度4,我有一个appConfigService,它提供了来自settings.json文件的api应用程序的url,类似于:
private appConfig: AppConfig;
constructor(private http: Http) {
this.loadConfig().subscribe(e => this.appConfig = e);
}
public loadConfig(): Observable<AppConfig> {
return this.http
.get("appsettings.json")
.map(this.mapAppConfig)
.catch(this.handleError);
}
然后我使用该url来处理以下所有请求。
它适用于在返回url后发送的请求,但是我在页面加载时发送的请求有问题(并且还没有检索到url)。
我知道我可以在启动时加载的服务中使用flatmap函数,但我发现自己基本上创建了两个相同函数的实现:
private getBasicRequest(offset: number = 0, limit:number = 0 ): Observable<Response>{
if (!this.appConfigService.isAppConfigValid()) {
var urlObserver = this.appConfigService.loadConfig();
var request = urlObserver
.flatMap(responseFromConfigService =>
this.http.get(responseFromConfigService.apiBaseAddress + "/entries/" + this.searchTerm + "?offset=" + offset + "&limit=" + limit));
return request;
} else {
var url = this.appConfigService.getApiLink("entries/" + this.searchTerm + "?offset=" + offset + "&limit=" + limit);
return this.http.get(url);
}
}
处理这种情况会有什么更好的方法? 我试图让appConfigService服务从“启动”开始,这将解决我的问题,但它没有用。
答案 0 :(得分:1)
始终使用observable而不是订阅它们。您的配置服务应如下所示:
export class AppConfigService
{
public config$: Observable<AppConfig>;
constructor(private http: Http) {
this.config$ = this.http
.get("appsettings.json")
.map(this.mapAppConfig)
.catch(this.handleError)
.share();
}
}
所有其他服务都使用它:
private getBasicRequest(offset = 0, limit = 0): Observable<Response> {
var config$ = this.appConfigService.config$;
var request = config$
.map(config => config.apiBaseAddress)
.map(base => `${base}/entries/${this.searchTerm}?offset=${offset}&limit=${limit})
.flatMap(url => this.http.get(url));
return request;
}