离子存储第一次返回未定义



我有一个存储设置为access_token,当我第一次让它返回时,我失败

了供应商:

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 调用并打印所有数据

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

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

也许用 1000ms 可能会打印它(这取决于 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。

最新更新