启动时的角度服务和请求依赖性

时间:2017-08-29 08:23:50

标签: angular angular-cli angular-services

我正在使用角度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服务从“启动”开始,这将解决我的问题,但它没有用。

1 个答案:

答案 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;
  }