Как использовать переменную вне обещания

Итак, у меня есть токен авторизации в моем ионном хранилище, и я должен передать его через http-запрос, но я не могу получить значение из обещания storage.get.then.

  getProducts(){
    let headers = new Headers(); 
    this.token= this.storage.get('Authorization').then((value)=>{
       this.token= value;
      return this.token; 
     });
     headers.append("Authorization",this.token);

    return this.http.get('https://vjtest.cobold.xyz/vapi/public/api/products',{headers: headers})
      .map(res=> res.json());

  }

person Mayank Singh Fartiyal    schedule 18.09.2017    source источник
comment
@wolverine, если я размещу http.get внутри, я получу ошибку в части подписки, так как http.get return не вернет значение продукта из getProduct // Извините, это плохо, чтобы выразить словами   -  person Mayank Singh Fartiyal    schedule 18.09.2017


Ответы (3)


Поскольку промисы асинхронны, вам нужно дождаться ответа, а затем вызвать второй запрос.

getProducts(){
     return this.storage.get('Authorization').then((value)=>{
       this.token= value;
       return this.sendReq(this.token)
     });
}

sendReq(token){
      let headers = new Headers();       
      headers.append("Authorization",token);
      return this.http.get('https://vjtest.cobold.xyz/vapi/public/api/products',{headers: headers})
      .map(res=> res.json());
}
person Sachila Ranawaka    schedule 18.09.2017
comment
Спасибо, ваш код имеет смысл, хотя я испытываю эту ошибку, есть идеи, почему? Свойство «подписаться» не существует для типа «Promise‹Observable‹any›› - person Mayank Singh Fartiyal; 18.09.2017
comment
вы должны подписаться на HTTP-запрос, чтобы получить доступ к запросу. - person Sachila Ranawaka; 18.09.2017

Вы либо возвращаете http-запрос (который будет Observable) и подписываетесь на свою функцию, либо манипулируете им после подписки на сам запрос:

this.http
.get('https://vjtest.cobold.xyz/vapi/public/api/products',{headers: headers})
.subscribe(data => {
  //manipulate what the request returned here
});
person Quentin Laillé    schedule 18.09.2017
comment
Я не манипулирую данными, я просто возвращаю их. Я пытаюсь получить токен из ионного хранилища и поместить его в заголовок для аутентификации. - person Mayank Singh Fartiyal; 18.09.2017
comment
Тогда вам не нужно отображать его. Это зависит от того, кто его вызвал, чтобы отобразить его и манипулировать им. - person Quentin Laillé; 18.09.2017

Попробуйте использовать функцию async.

getToken() {
   return this.storage.get('Authorization');
}

async getProducts(){
  this.token = await getToken();
  let headers = new Headers(); 
  headers.append("Authorization",this.token);
  return his.http.get('https://vjtest.cobold.xyz/vapi/public/api/products',headers: headers}).map(res=> res.json());

}
person wolverine    schedule 18.09.2017
comment
@MayankSingh попробуйте удалить ключевое слово function, обратитесь к обновленному ответу - person wolverine; 18.09.2017