2017-08-17 4 views
0

私はaccess_tokenはする設定のストレージを持っていると私は得るとき、それは私が失敗した最初の時間を返すためにイオン性ストレージが初めてundefinedを返します

プロバイダ:これは、このファイル

のコンストラクタは

getLayMinisters(){ 
    console.log(this.access_token); 
    return this.http.get(
    this.api.url() + '/faith-leader/' + 'lay-ministers', 
    { 
     headers: new Headers({ "Authorization": "Bearer " + this.access_token }) 
    } 
    ) 
    .map(
    response => response.json() 
    ); 
} 

です

access_token: any; 
layMinister_id: string; 

constructor(
    public http: Http, 
    public storage: Storage, 
    public api: ApiProvider 
) { 
    this.storage.get('access_token').then(
     (access_token) => { 
     this.access_token = access_token; 
     } 
    ) 
    } 

これは私のページにある

getLayMinisters(){ 
    this.layMinisterProvider.getLayMinisters().subscribe(
     data => { 
     this.layMinisters = data; 
     } 
    ); 
} 

ページが最初にそれがundefinedとしてconsole.log(this.access_token)リターンを返す実行し、その後、私は応答していないAPIのエラーが出る場合はこれより上

layMinisters = []; 

constructor(
    public navCtrl: NavController, 
    public navParams: NavParams, 
    public layMinisterProvider: LayMinisterProvider, 
    public alertCtrl: AlertController 
) {} 

ionViewDidLoad() { 
    this.getLayMinisters(); 
} 
ionViewWillEnter() { 
    // this.getLayMinisters(); 
} 

です。しかし、ページを開くためにリンクを再度クリックすると、access_tokenが表示され、api呼び出しが実行され、すべてのデータが出力されます。

+0

'this.storage.get'は非同期操作です。 'setTimeout(()=> {)、2000)' – echonax

答えて

1

getLayMinisters()を呼び出すと、access_tokenは非同期であるため、そうそれは約束ですので、あなたがhttp.get機能を1000ミリ秒とたぶん

setTimeout(()=>{ 
    console.log(this.access_token) 
},1000) 

にコーディングする場合は、http.getはおそらくthis.storage.get()、終了していないんとき、おそらくそれはの依存(それを印刷しますstorage.get()応答時間を約束します)。

getToken(){ 
    return this.storage.get('access_token') 
} 

と、ページ内:

getLayMinisters() { 
    if(!this.layMinisterProvider.access_token){ 
     this.layMinisterProvider 
     .getToken() 
     .then((access_token) => { 
      this.layMinisterProvider.access_token = access_token; 
      this.getData(); 
     }) 
    }else{ 
     this.getData(); 
    } 
} 
getData(){ 
    this.layMinisterProvider 
       .getLayMinisters() 
       .subscribe(data => { 
        this.layMinisters = data; 
       }); 
} 

必見publicとしてaccess_tokenはしているプロバイダを覚えておいてください

あなたはlayMinisterProviderで関数を作成することができ、それを解決するには。

+0

これは完全にうまくいった – SCRATK

+0

責任を分けて、それをサービスに入れることができます。そのために残念。 – SergioEscudero