2016-11-15 48 views
1

我有一個用例的地方將是巨大的,如果有可能以某種方式返回.then()檢索到的值。角2 - 返回`then`內 - 異步

讓我告訴你爲什麼,什麼和希望。

幾乎在每個API調用中,我都希望沿API_KEYDEVICE_ID發送。現在對於UX原因,這些值wihin在本地存儲稱爲user對象(將安全存儲以後)。

這裏的事情是,我headers將在第一行創建的空頭。這是有道理的,因爲.then()將是異步的。

getUserHeaders(): Headers { 
     let headers: Headers = new Headers(); 
     let user = NativeStorage.getItem("user").then(
      data => { 
       headers.append('API_KEY', data.json().apiKey); 
       headers.append('DEVICE_ID', data.json().deviceId); 
      }, 
      error => { 
       console.log("error"); 
       headers.append('API_KEY', 'TEST'); 
       headers.append('DEVICE_ID', 'TEST'); 
      } 
     ); 
     return headers; 
    } 

現在我想做的是在每次調用有:F.E.

this.http.get('someUrl', { headers: this.getUserHeaders() }).map(..); 

我的問題是,我怎麼能返回頭無論是從dataerror塊內,或者我應該嘗試一個完全不同的方法?

回答

0

那是不可能的。一旦異步,永遠異步。你無能爲力。

剛剛在.then(..)返回headers並返回無極

getUserHeaders(): Headers { 
    let headers: Headers = new Headers(); 
    return = NativeStorage.getItem("user").then(
     data => { 
      headers.append('API_KEY', data.json().apiKey); 
      headers.append('DEVICE_ID', data.json().deviceId); 
      return headers; 
     }, 
     error => { 
      console.log("error"); 
      headers.append('API_KEY', 'TEST'); 
      headers.append('DEVICE_ID', 'TEST'); 
      return headers; 
     } 
    ); 
} 

那麼調用者可以使用它像

this.getUserHeaders().then(headers => /* doSoemthingWithHeaders */) 
+0

這樣的話它會成爲像'this.getUserHeaders()即可。 (headers => this.http.get('someUrl',{headers:headers}).map(...))'right? – Ivaro18

+0

但這意味着我的API調用將返回一個可觀察的承諾? :o – Ivaro18

+0

您還可以使用可觀察到的頁眉和使用'mergeMap'或其他一些運營商。也許可觀察的運營商也支持'Promise'(不知道我自己沒有使用它們)。 –