等待Ionic 2打字本本地存储承诺在继续之前解决

时间:2017-05-30 18:58:32

标签: angular typescript promise ionic2 json-web-token

我有一个Ionic 2应用程序,我希望在其中实现注销功能。我想在本地存储中将Json Web Token的值设置为null,然后在设置该值后,将用户发送到登录页面。

我遇到的问题是,在将用户带到登录页面之前,应用程序没有等待设置JWT的值。这是一个问题,因为在登录页面上,我有一个功能,如果他们有一个有效的JWT,则自动记录用户。由于程序没有阻塞并等待在存储中设置值,因此用户在注销后立即重新登录。

如何在将用户发回登录页面之前等待令牌的值?

退出功能:

logout() {
this.storage.ready().then(() => {
    this.storage.set('token', '').then(data => {
        this.navCtrl.setRoot(LoginPage);
    });
});

CheckAuthentication功能:

    checkAuthentication() {
return new Promise((resolve, reject) => {
  this.storage.get('token').then((value) => {

    this.token = value;

    let headers = new Headers();
    headers.append('Authorization', this.token);

    this.http.get('apiURL', { headers: headers })
      .subscribe(res => {
        resolve(res);

      }, (err) => {
        reject(err);
      });

  });

  });
  }

IonViewWillLoad:

  ionViewWillLoad(){
 //Check if already authenticated
    this.auth.checkAuthentication().then((res) => {
        console.log("Already authorized");
        this.loading.dismiss();
        this.navCtrl.setRoot(HomePage);
    }, (err) => {
        console.log("Not already authorized");
        this.loading.dismiss();
    });}

2 个答案:

答案 0 :(得分:1)

你可以在这里做一些事情。

首先,我会重构代码,使其更具可读性。如果您看到我如何拥有以下功能,您会注意到我们正在利用自然提供的承诺,我们可以将它们链接在一起而无需嵌套我们的then()。 / p>

checkAuthentication()中,您不需要像现在这样创建Promise。您可以将http Observable作为承诺返回。如果http调用成功,那么promise将解决。如果http调用失败,则生成的promise将拒绝。

最后,我会尝试使用ionViewDidLoad代替willLoad



logout() {
  this.storage.ready()
    .then(() => this.storage.set('token', ''))
    .then(data => this.navCtrl.setRoot(LoginPage))
}

checkAuthentication() {
  return this.storage.get('token')
    .then((value) => {
      this.token = value;

      let headers = new Headers();
      headers.append('Authorization', this.token);

      return Observable.toPromise(
        this.http.get('apiURL', { headers: headers })
      );
    });
}

ionViewDidLoad() {
  this.auth.checkAuthentication()
    .then((res) => {
      console.log("Already authorized");
      this.loading.dismiss();
      this.navCtrl.setRoot(HomePage);
    })
    .catch((err) => {
      console.log("Not already authorized");
      this.loading.dismiss();
    });
}




答案 1 :(得分:0)

在退出功能中,它应该删除令牌而不是将其设置为空白''。因为注销后令牌仍然存在于存储中。

this.storage.removeItem('token')