2017-06-19 88 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); 
}