Ionic Storage第一次返回undefined

时间:2017-08-17 18:10:11

标签: angular typescript ionic-framework ionic2 ionic3

我有一个存储设置为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调用并打印所有数据

1 个答案:

答案 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作为公开。