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})); })来做到这一点。

相关问题