Как повторно отправить событие jquery ajax от глобальных ловцов? - PullRequest
1 голос
/ 19 февраля 2020

У меня есть этот код в моем jquery коде

$(document).ajaxError(function(event, xhr, settings) {
    var url = new URL(settings.url);
    if (url.pathname.toLowerCase().startsWith("/api/".toLowerCase()) && xhr.status === 401) {
        var new_access_token = getToken();
        // replace header value "Authorization" with "Bearer " + new_access_token
        // re-submit ajax request
    }
});

Кто-нибудь знает, как отредактировать запрос и повторно отправить его?

Спасибо

1 Ответ

0 голосов
/ 21 февраля 2020

Вместо того, чтобы связываться с функцией ajaxError, как вы относитесь к обработке ошибки именно там, где вы делаете запрос AJAX? Существует встроенный обратный вызов error, который вы можете использовать, и таким образом у вас все равно будет простой доступ к исходному запросу, чтобы его можно было отправить повторно.

const getToken = () => 'Bearer 123';

const sendRequestWithResend = (url, options) => {
  let existingErrorFunction = options.error;
  options.error= function(XMLHttpRequest, textStatus, errorThrown) {
    if(existingErrorFunction){
      existingErrorFunction(XMLHttpRequest, textStatus, errorThrown);
    }
    //resend request with header token, if header wasn't set
    if(options.headers && options.headers.Authorization){
      return; //token was already set
    }else{
      if(!options.headers){
        options.headers = {};
      }
      options.headers.Authorization = getToken();
      sendRequestWithResend(url,options);
    }
  }
  $.ajax(url,options);
}

sendRequestWithResend('https://notarealdomainforthisexample.com',{});

Здесь я создал функция-обёртка для ваших AJAX звонков. Он автоматически добавляет обработчик ошибок (при сохранении любой существующей функции обработки ошибок), который повторяет запрос (рекурсивно вызывая ту же функцию) с токеном-носителем (если у него уже нет токена - важно предотвратить бесконечное число l oop).

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