Ionic framework 离子承诺与储存

Ionic framework 离子承诺与储存,ionic-framework,promise,ionic3,Ionic Framework,Promise,Ionic3,设置存储或发现错误后如何返回API调用? 在console.log中,seq总是在存储的令牌之前返回 我希望的顺序是: 用户使用函数SubmitForm()提交表单 该函数在user.ts页面中调用另一个函数,如果用户身份验证成功,将弹出login.ts页面 user.ts当前处理api调用并设置存储(如果身份验证成功)。在调用isLoggedIn检查(在login.ts页面中)后,存储总是延迟,因此无法弹出 login.ts SubmitForm(account: any) { thi

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

我希望的顺序是:

  • 用户使用函数SubmitForm()提交表单
  • 该函数在user.ts页面中调用另一个函数,如果用户身份验证成功,将弹出login.ts页面
  • 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(用户提供商)


    当您有一个类似于您的函数并且需要“等待其中的异步函数完成”时,您需要使用async/wait。基本上,这将您的整个函数包装成一个承诺,然后返回。异步函数总是自动返回一个承诺

    像这样的东西可以工作,但是我不太确定你的代码,因为你只提供了一个片段。如果您提供一个代码沙盒,我可以更深入地了解它

      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
      }
    

    您需要在方法中使用async/await。我已经添加了login.ts页面。假设身份验证成功,但由于isLoggedIn尚未设置为true,navCtrl从未弹出。它没有设置为true的原因是存储尚未设置它。如果希望使用承诺,则需要使用async/await。对于这样的情况,当你用不好的眼光看待它时,你也可以简单地传递你的登录对象,然后在你存储完对象后调用一个方法,比如.afterLogin()。因此,您的登录方法调用将是login(account,this)
      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
      }