2017-08-29 39 views
0

我在角4工作,我有一个提供API应用程序的URL从settings.json文件,像一个appConfigService:角服务,并请求依赖

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尚未检索)。

我知道我可以使用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服务在'startup'开始,它可以解决我的问题,但它不起作用。

+0

您可以使用https://stackoverflow.com/questions/37611549/how-to- pass-parameters-rendered-from-backend-to-angular2-bootstrap-method/37611614#37611614或https://stackoverflow.com/questions/36271899/what-is-the-correct-way-to-share-the-结果的角2-http-network-call-in/36291681#36291681 –

回答

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; 
    } 
+1

感谢您的答案!我试过这种方式,但问题是我最终在每次请求时都请求了appsettings.json,我只想请求它一次,它只包含一个url,这是应用程序中随处可见的一个url。 – Faz

+0

检查我的更新:看看share();-) –

+0

谢谢你的工作,但有没有办法避免在所有其他请求中使用flatmap? 在appsettings.json中,我有基本的api网址,因此我在任何地方都使用它,并且在任何地方使用flatmap都有点烦人。 – Faz