2016-11-15 44 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'(不知道我自己没有使用它们)。 –