首页 文章

Ionic Storage第一次返回undefined

提问于
浏览
0

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

1 回答

  • 1

    当你调用getLayMinisters()时,access_token是未定义的,因为这些任务是异步的,所以当你执行http.get时,可能this.storage.get()没有完成因为它是一个promise,如果你在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作为公共 .

相关问题