等待结果后再继续

Yan*_*iav 4 javascript angular recaptcha-v3

我正在使用 Google 的 reCaptcha V3 作为我的 Angular(7) 项目的一部分。

我想在继续执行其余代码并检查令牌是否经过验证之前等待令牌的响应。

declare var grecaptcha: any;

  ngOnInit() {
    this.validateCaptcha();
    if(this.gToken)
    {
      ...
    }
  }
  gToken:string;
  validateCaptcha()
  {
    let self = this;
    grecaptcha.ready(function() {
    grecaptcha.execute('reCAPTCHA_site_key', {action: 'homepage'}).then(function(token){
      self.gToken = token;
    });
});
  }
Run Code Online (Sandbox Code Playgroud)

问题是它this.gToken是未定义的,因为它不等待validateCaptcha完成其工作。我也尝试过asyncawait但没有帮助。也许我用错了。

Ric*_*. M 9

您可以在这里使用 Promise。

您需要等待令牌生成。

您还可以使用 async/await 代替 Promise。

ngOnInit() {
   this.validateCaptcha().then(token => { // Here wait token generated
      if(token) {
      }
   })
}

validateCaptcha() {
    return new Promise((res, rej) => {
      grecaptcha.ready(() => {
              grecaptcha.execute('reCAPTCHA_site_key', {action: 
                 'homepage'}).then((token) => {
                  return res(token);
              })

      })
    })
}
Run Code Online (Sandbox Code Playgroud)

使用 async/await 更新示例。

使用 async/await 时,上面演示的 validateCaptcha 方法保持不变(必须返回 Promise)

async ngOnInit() {  // async keyword added here
    try {
        let token = await this.validateCaptcha();  // await keyword added here
        if(token) {
        }
    } catch(e) {
    }
    
}
Run Code Online (Sandbox Code Playgroud)