На основе опубликованного вами кода у вас есть следующие опции:
1-й вариант использования then
contactForm.addEventListener('submit', (e) => {
e.preventDefault();
captchaVerification().then((response) => {
// check if response is ok
if(response ... is not what expected end here) {
return false;
}
const data = new FormData(contactForm)
_alert.innerHTML = 'Sending message...'
_alert.setAttribute('class', `alert show`);
ajax(contactForm.method, contactForm.action, data)
.then(([r, t]) => outcome(r ? r = 'success' : r = 'error', t))
.catch(e => outcome('error', e))
});
});
2-й вариант использования await
contactForm.addEventListener('submit', async (e) => {
e.preventDefault();
let response = await captchaVerification();
// check if response is ok
if(response ... is not what expected end here) {
return false;
}
const data = new FormData(contactForm)
_alert.innerHTML = 'Sending message...'
_alert.setAttribute('class', `alert show`);
ajax(contactForm.method, contactForm.action, data)
.then(([r, t]) => outcome(r ? r = 'success' : r = 'error', t))
.catch(e => outcome('error', e))
});
Вы также можете попробовать изменить две-три строки в вашем примере hastebin
.
var isRendered = false;
async function captchaVerification() {
return await new Promise((resolve, reject) => {
captcha.style.display = 'block'
const verifyCallback = (response) => {
if (response) {
captcha.style.display = 'none'
grecaptcha.reset()
return resolve(response)
} else {
grecaptcha.reset()
return reject('Invalid captcha verification.')
}
}
if (!isRendered) {
grecaptcha.render('g-recaptcha', {
'sitekey': 'my-secret-key',
'theme': 'dark',
'callback': verifyCallback
})
isRendered = true;
}
})
}