Вызов ajax внутри ajax с такими же обратными вызовами - PullRequest
0 голосов
/ 28 мая 2020

Мне нужно получить токен перед выполнением моих 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;
    }
});

Я что-то упустил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...