2016-09-06 146 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 '可以賦值給另一個「= //// –