Javascript 我将如何处理谷歌';让我们用承诺来重温一下吧?

Javascript 我将如何处理谷歌';让我们用承诺来重温一下吧?,javascript,promise,recaptcha,invisible-recaptcha,Javascript,Promise,Recaptcha,Invisible Recaptcha,我想做的是做一个链接,当点击打开谷歌的隐形重述。那部分很好用。但我也想捕捉错误,这就是它失败的地方。它在最新版本的Firefox和Chrome中都失败了,错误是“uncaught exception:undefined”(Firefox)“uncaught(in promise)undefined”(Chrome),并可追溯到调用reject()的行。对警报(“错误”)的调用从不触发 我做错了什么?还有别的办法吗 <script> var onloadCallback, onerro

我想做的是做一个链接,当点击打开谷歌的隐形重述。那部分很好用。但我也想捕捉错误,这就是它失败的地方。它在最新版本的Firefox和Chrome中都失败了,错误是“uncaught exception:undefined”(Firefox)“uncaught(in promise)undefined”(Chrome),并可追溯到调用reject()的行。对警报(“错误”)的调用从不触发

我做错了什么?还有别的办法吗

<script>
var onloadCallback, onerrorCallback;
var promise = new Promise(function(resolve, reject) {
    onerrorCallback = function() {
        reject();
    }
    onloadCallback = function() {
        var form = document.createElement('form'),
            recaptcha = document.createElement('div');
        form.method = 'post';
        resolve(grecaptcha.render(recaptcha, {
            sitekey: 'INVISIBLE RECAPTCHA SITE KEY',
            size: 'invisible',
            callback: function() {
                form.submit()
            }
        }));
        form.appendChild(recaptcha);
        document.body.appendChild(form);
    }
})

function userClick() {
    promise
        .then(grecaptcha.execute)
        .catch(function(){alert('Error')});
}
</script>
<script async defer src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit&hl=en" onerror="onerrorCallback()"></script>
<p>Please <a href="javascript:userClick()">click here</a> to solve the recaptcha</p>

var onloadCallback,onerrorCallback;
var承诺=新承诺(功能(解决、拒绝){
onerrorCallback=函数(){
拒绝();
}
onloadCallback=函数(){
var form=document.createElement('form'),
recaptcha=document.createElement('div');
form.method='post';
解析(grecaptcha.render){
sitekey:“不可见的RECAPTCHA站点密钥”,
大小:'不可见',
回调:函数(){
表格提交(
}
}));
附录儿童表格(recaptcha);
文件.正文.附件(表格);
}
})
函数userClick(){
承诺
.然后(grecaptcha.execute)
.catch(函数(){alert('Error')});
}
请解决这个问题


我发现了问题。下面是我如何修复它的:

<script>
var onloadCallback, onerrorCallback;
var promise = new Promise(function(resolve, reject) {
    onerrorCallback = function() {
        reject();
    }
    onloadCallback = function() {
        var form = document.createElement('form'),
            recaptcha = document.createElement('div');
        form.method = 'post';
        resolve(grecaptcha.render(recaptcha, {
            sitekey: 'INVISIBLE RECAPTCHA SITE KEY',
            size: 'invisible',
            callback: function() {
                form.submit()
            }
        }));
        form.appendChild(recaptcha);
        document.body.appendChild(form);
    }
})

function userClick() {
    promise
        .then(function(id) {
            grecaptcha.execute(id);
        })
        .catch(function(){alert('Error')});
}
</script>
<script async defer src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit&hl=en" onerror="onerrorCallback()"></script>
<p>Please <a href="javascript:userClick()">click here</a> to solve the recaptcha</p>

var onloadCallback,onerrorCallback;
var承诺=新承诺(功能(解决、拒绝){
onerrorCallback=函数(){
拒绝();
}
onloadCallback=函数(){
var form=document.createElement('form'),
recaptcha=document.createElement('div');
form.method='post';
解析(grecaptcha.render){
sitekey:“不可见的RECAPTCHA站点密钥”,
大小:'不可见',
回调:函数(){
表格提交(
}
}));
附录儿童表格(recaptcha);
文件.正文.附件(表格);
}
})
函数userClick(){
承诺
.然后(函数(id){
grecaptcha.execute(id);
})
.catch(函数(){alert('Error')});
}
请解决这个问题

问题出在then()调用中。由于没有定义grecaptcha,JavaScript停止并从未进入catch()调用。控制台上打印的错误消息与此无关


我通过将对grecaptcha.execute的调用包装在一个匿名函数中解决了这个问题。

我不明白为什么您需要承诺而不是直接使用来自验证码的事件或回调