2017-06-19 89 views
1

我有一项服务用于调用webapi服务未进行同步

webapi URL是从本地json文件中读取的。

问题是服务方法调用了错误的webapi URL,我怀疑原因是这些方法在构造函数代码完成执行之前调用

这是可疑代码:

构造

constructor(private http: AuthHttp, private router: Router, private paramService: ParamService) { 

    this.paramService.get_Config().subscribe(
     data => { 

     this.baseUrl = data.ReportApp_WebApi; 
     } 
    );   

    } 

实例方法

Get_LavorazioneRicette() : Observable<any> { 
    var url = this.baseUrl + "api/masterdata/get/LavorazioneRicette"; 

    return this.http.get(url, this.getRequestOptions) 
     .map(response => response.json()) 
     .catch(this.handleError); 
    } 

我怎样才能解决这个问题?

谢谢支持

回答

1

基本规则:不要在服务中使用订阅。这总是使代码复杂和困难。

这里你不需要构造函数。你可以做到这一点。

getBaseUrl(): Observable<string>{ 
    if(!this.baseUrl){ 
    this.baseUrl = data.ReportApp_WebApi 
    } 
    return Observable.of(this.baseUrl); 
} 

Get_LavorazioneRicette() : Observable<any> { 
    return getBaseUrl() 
     .map(baseUrl=> baseUrl+ "api/masterdata/get/LavorazioneRicette") 
     .flatMap(url => this.http.get(url, this.getRequestOptions) 
          .map(response => response.json()) 
     .catch(this.handleError); 
} 

上面的代码是很好的,当获取网址是异步的,适用于同步也很好。 但localStorage不是异步的。所以,不需要太担心。你可以做到这一点。你甚至不需要存储baseUrl。

Get_LavorazioneRicette() : Observable<any> { 
const url = data.ReportApp_WebApi + "api/masterdata/get/LavorazioneRicette"; 
    return this.http.get(url, this.getRequestOptions) 
       .map(response => response.json() 
     .catch(this.handleError); 
}