0

我試圖從本地存儲獲取我的令牌並將其設置在標題中,但我不知道它爲什麼不設置。訪問本地存儲數據併發送到離子2服務器的正確方法是什麼?

getMurals() { 
     return this.http.get(AppSettings.API_ENDPOINT+'/murals', this.getHeader()) 
      .map((response: Response) => response.json()); 
    } 

private getHeader() { 
    let header = new Headers(); 
    this.storage.get('token').then((token)=>{ 
     if(token){ 
     header.append('authorization',token); 
     header.append('Content-Type','application/x-www-form-urlencoded'); 
     } 
    }) 
    return new RequestOptions({ headers: header }); 
    } 

回答

2

header還沒有準備,因爲它在等待得到storage承諾得到解決。當您撥打return new RequestOptions({ headers: header });時,header is not prepared。流程如下:

  1. let header = new Headers();
  2. 正在等待存儲以解析令牌。尚未完成,仍然進行到3.
  3. 返回新的RequestOptions({headers:header});

您可以返回承諾。就像這樣:

getMurals() { 
    this.getHeader().then(data => { 
     return this.http.get(AppSettings.API_ENDPOINT+'/murals', data) 
     .map((response: Response) => response.json()); 
    }) 
} 

private getHeader() { 
    let header = new Headers(); 
    return new Promise((resolve) => { 
     this.storage.get('token').then((token)=>{ 
     if(token){ 
      header.append('authorization',token); 
      header.append('Content-Type','application/x-www-form-urlencoded'); 
     } 
     resolve(new RequestOptions({ headers: header })); 
     }); 
    }); 
} 

而且,有很多錯誤處理在這裏做錯誤的情況下的。爲了更加清晰,請參閱this

注意:這也可以通過創建一個observable來完成。你可以使用Observable.create(observer => { observer.next(new RequestOptions({headers: header})); })來做到這一點。

相關問題