我有一个存储设置为access_token,当我第一次失败时将其返回
PROVIDER:
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 :(得分:1)
当你调用getLayMinisters()时,access_token是未定义的,因为这些任务是异步的,所以当你执行http.get时,this.storage.get()可能没有完成,因为它是一个承诺,如果你在http中编码.get功能
setTimeout(()=>{
console.log(this.access_token)
},1000)
也许用1000ms可能会打印它(它取决于storage.get()promise响应时间)。
要解决此问题,您可以在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作为公开。