离子承诺和存储

时间:2019-10-13 12:58:33

标签: ionic-framework promise ionic3

设置存储或发现错误后如何返回API调用? 从console.log中,总是在令牌存储之前返回 seq

我想要的顺序是:

  1. 用户使用功能 SubmitForm()提交表单。
  2. 该函数在 user.ts 页面中调用另一个函数,如果用户身份验证成功,则将弹出login.ts页面。
  3. user.ts 当前正在处理api调用并设置存储(如果身份验证成功)。在调用isLoggedIn(在login.ts页面中)的检查之后,存储总是被延迟,因此无法弹出。

login.ts

SubmitForm(account: any) {
    this.user.login(account).subscribe((resp) => {
        if(this.user.isLoggedIn){
          this.navCtrl.pop();
        }
    }, (err) => {

    });
}

user.ts(用户提供者)

login(logininfo: any) {
    let seq = this.api.post('auth/login', logininfo).share();

    seq.subscribe((res: any) => {
      if (res.status == 'success') {
        this.storage.set('token', res.token).then(data => {
          console.log('Token Stored', data); //This always get called after `return seq;`
          this.token = data;
          this.isLoggedIn = true;
        },
        error => {
          console.log('Error storing token', error);
        });
      }
    }, err => {
      console.error('ERROR', err);
    });

    return seq; //This always called before the token was stored
}

1 个答案:

答案 0 :(得分:0)

当您有一个像您这样的函数并且需要“等待其中的异步函数完成”时,您需要使用async / await。基本上,这会将您的整个函数包装到一个Promise中,然后将其返回。异步函数总是自动返回Promise。

类似的事情可能起作用,但是由于您仅提供了一个代码段,因此我不太确定您的代码。如果您提供一个codeandbox,我可以对其进行更深入的了解。

  async login(logininfo: any) {
    let seq = this.api.post('auth/login', logininfo);

    let returnValue = undefined;
    let subscription = await seq.subscribe(async (res: any) => {
      if (res.status == 'success') {
        returnValue = await this.storage.set('token', res.token).then(data => {
          console.log('Token Stored', data); //This always get called after `return seq;`
        },
        error => {
          console.log('Error storing token', error);
        });
      }
    }, err => {
      console.error('ERROR', err);
    });

    return returnValue; //This always returns a promise
  }