2017-08-17 74 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; 
     } 
    ); 
} 

这是它上面

layMinisters = []; 

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

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

当页面第一次运行时,它返回console.log(this.access_token)收益为undefined,然后我得到的API的错误没有响应。但是,当我再次单击链接打开页面时,它运行良好并打印access_token并运行api调用并打印所有数据

+0

'this.storage.get'是一个异步操作。这就像'setTimeout(()=> {},2000)' – echonax

回答

1

当您调用getLayMinisters()时,由于这些任务是异步的,因此access_token未定义,所以当你http.get可能this.storage.get()还没有完成,因为这是一个承诺,如果在http.get码功能

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

也许可能会打印出来(这取决于的storage.get()承诺响应时间)。

要解决它,你可以在layMinisterProvider创建一个函数:

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; 
       }); 
} 

记住的提供者必须已ACCESS_TOKEN公众。

+0

这很好用 – SCRATK

+0

分离责任,你可以把它放在服务中,因为这是它的责任。对不起。 – SergioEscudero