2016-11-15 9 views
1

У меня есть файл usecase, где было бы здорово, если бы можно было как-то вернуть значение, полученное в .then().Угловой 2 - Возврат внутрь `then` - async

Позвольте мне показать вам, почему и что и чего хотите.

Почти каждый вызов API я хочу отправить по адресу API_KEY и DEVICE_ID. Теперь для причин UX эти значения относятся к объекту с именем 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(..); 

Мой вопрос, как я могу вернуть заголовки либо из блока data и error или я должен попробовать совершенно иной подход?

ответ

0

Это невозможно. Асинхронно, асинхронно. Вы ничего не можете с этим поделать.

Просто вернуть headers изнутри .then(..) и вернуть обещание

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' (не знаю, что я сам их не использую). –