2016-09-06 144 views
2

Im与Ionic2 + Laravel合作。 我试图做一个“拦截器”,将放在标题(JWT)从本地存储在我的所有Http请求身份验证令牌。

所以,我犯了一个服务用的方法:等待承诺在外功能完成

post(url : string, json : any) : Observable <\Response> { 

    var headers = new Headers(); 
    var token = null; 
    this.local.get("token").then((tk) => { 
     headers.append('Authorization', 'Bearer ' + tk); 
     var options = new RequestOptions({headers: headers}); 
     token = tk; 
    }); 

    -> wait the 'token' != null <- 
    return this.http.post(url, JSON.stringify(json), options); 
} 

的问题是:
我期待一个 “可观察< \响应> http.post()” 返回时调用后( )从这项服务。
但是,我需要“this.local.get()”Promise完成解决方案,因为我需要从LocalStorage令牌追加到标题。

我怎样才能使“this.local.get()”承诺,获得令牌,所以,声明Observable http.post()并返回它? (对外部功能)

我只是找不到办法。有什么建议么?谢谢:DD

回答

0

关键在于您致电Promise对象上的then()方法。与done()(返回undefined)不同,then返回另一个承诺,其值将解析为作为参数传递给then的函数返回的值。你可以利用这两次:第一次您的令牌传递给http.post()通话,并再次返回整个承诺你的post()功能:

post(url : string, json : any) : Observable <\Response> { 

    var headers = new Headers(); 
    return this.local.get("token").then((tk) => { 
     headers.append('Authorization', 'Bearer ' + tk); 
     var options = new RequestOptions({headers: headers}); 
     return tk; 
    }).then(tk){ 
     return this.http.post(url, JSON.stringify(json), options); 
    }; 
} 
+0

哇,感谢快速回答。已经尝试过了。正如我所说,我期待一个Observable <\Response>回报。所以,我得到了Typescript错误:“错误TS2322:键入'承诺'是不可分配类型'Observable '” –

+0

即使我删除返回类型,我得到了像“Property'map'不存在键入'Promise '“导致即时通话 - >地图()和地图是一个Observable funcion(不是Promise ) –

+0

最后,我尝试用>施放回报,并且我得到了”Both type'Promise '也没有输入'Observable '可以赋值给另一个“= //// –