等待结果,然后继续

时间:2020-02-11 15:56:51

标签: javascript angular recaptcha-v3

我在Angular(7)项目中使用了Google的reCaptcha V3。

我想先等待令牌的响应,然后再进行其余代码,然后再检查令牌是否经过验证。

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;
    });
});
  }

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

2 个答案:

答案 0 :(得分:2)

您可以在此处使用Promise。

您需要等待直到生成令牌。

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

<receiver
    android:name="com.your.receiver"
    android:enabled="true"
    android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                    <data android:scheme="package"/> 
                </intent-filter>
 </receiver>
 <uses-permission android:name="android.permission.BROADCAST_PACKAGE_REMOVED" />

使用异步/等待更新示例。

使用异步/等待时,您的validateCaptcha方法保持不变(必须返回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);
              })

      })
    })
}

答案 1 :(得分:1)

为什么没有validateCaptcha()返回承诺?

declare var grecaptcha: any;

  ngOnInit() {
    this.validateCaptcha().then(() => {
        if(this.gToken)
        {
          ...
        }
    });
  }
  gToken:string;
  validateCaptcha()
  {
    let self = this;
    return new Promise((resolve, reject) => {
        grecaptcha.ready(function() {
            grecaptcha.execute('reCAPTCHA_site_key', {action: 'homepage'}).then(function(token){
            self.gToken = token;
            resolve();
         });
       });
    });
  }