Мне нужно получить токен перед выполнением моих ajax вызовов. Чтобы добиться этого, я попытался использовать beforeSend
внутри своего вызова $.ajaxSetup
.
$.ajaxSetup({
beforeSend: async(jqXHR, settings) => {
await grecaptcha.execute(SITE_KEY, { action: 'ajax' })
.then(token => {
settings.url += '&_recaptcha_token=' + token;
});
}
});
Однако здесь есть небольшая проблема. Обратный вызов beforeSend
не может обрабатывать асинхронные функции. К сожалению, это по замыслу и не подлежит изменению.
Мой следующий подход заключался в отмене первого ajax и отправке второго, когда мой токен станет доступен.
$.ajaxSetup({
beforeSend: (jqXHR, settings) => {
grecaptcha.execute(SITE_KEY, { action: 'ajax' })
.then(token => {
settings.url += '&_recaptcha_token=' + token;
$.ajax($.extend(settings, { beforeSend: $.noop }));
);
return false;
}
});
Это работает. Первый вызов ajax завершается неудачно, потому что он отменен, но второй выполняется с действующим токеном. Но есть проблема.
Мои обратные вызовы (done
, then
, fail
, always
) больше не выполняются.
Есть ли способ решить эту проблему? Я также попытался передать обратные вызовы исходного объекта jqXHR
второму вызову ajax, но это тоже не сработало.
$.ajaxSetup({
beforeSend: (jqXHR, settings) => {
grecaptcha.execute(SITE_KEY, { action: 'ajax' })
.then(token => {
settings.url += '&_recaptcha_token=' + token;
$.ajax($.extend(settings, { beforeSend: $.noop }))
.then((data, textStatus, xhr) => jqXHR.then(data, textStatus, xhr))
.fail((xhr, textStatus, errorThrown) => jqXHR.fail(xhr, textStatus, errorThrown))
.always(() => jqXHR.always());
);
return false;
}
});
Я что-то упустил?