Cara menggunakan variabel di luar janji

Jadi saya memiliki token otorisasi di penyimpanan ionik saya dan saya harus meneruskannya melalui permintaan http tetapi sepertinya saya tidak bisa mendapatkan nilai dari janji 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 sumber
comment
@wolverine jika saya menempatkan http.get di dalam saya akan mendapatkan kesalahan di bagian berlangganan karena http.get return tidak akan mengembalikan nilai produk dari getProduct //Maaf buruk untuk diungkapkan dengan kata-kata   -  person Mayank Singh Fartiyal    schedule 18.09.2017


Jawaban (3)


Karena janji tidak sinkron, Anda harus menunggu respons dan kemudian memanggil permintaan kedua.

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
Terima kasih, kode Anda masuk akal meskipun saya mengalami kesalahan ini, tahukah Anda alasannya? Properti 'berlangganan' tidak ada pada tipe 'Janji‹Dapat Diamati‹apa pun›› - person Mayank Singh Fartiyal; 18.09.2017
comment
Anda harus berlangganan HTTP, dapatkan permintaan untuk mengakses permintaan tersebut. - person Sachila Ranawaka; 18.09.2017

Anda bisa mengembalikan permintaan http (yang akan menjadi Observable) dan berlangganan fungsi Anda, atau Anda memanipulasinya setelah berlangganan permintaan itu sendiri:

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
Saya tidak memanipulasi data, saya hanya mengembalikannya. Saya mencoba mengambil token dari penyimpanan ionik dan memasukkannya ke dalam header untuk otentikasi. - person Mayank Singh Fartiyal; 18.09.2017
comment
Maka Anda tidak perlu memetakannya. Terserah siapa pun yang memanggilnya untuk memetakan dan memanipulasinya. - person Quentin Laillé; 18.09.2017

Coba gunakan fungsi 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 coba hapus kata kunci fungsi, lihat jawaban yang diperbarui - person wolverine; 18.09.2017