jQuery ajaxPrefilter срабатывает после отправки запроса - PullRequest
0 голосов
/ 17 октября 2018

Согласно описанию jQuery.ajaxPrefilter () , он должен быть запущен до того, как запрос будет отправлен на $.ajax(), но из того, что я вижу в моем проекте, конечная точка API серверасначала вызывается, затем вызывается функция ajaxPrefilter, когда уже слишком поздно вносить какие-либо изменения.

Возможно, я что-то здесь упускаю, но я этого не вижу ...

Вот как выглядит моя регистрация:

$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
    if (options.url.startsWith('api') || options.url.startsWith('/api')) {

        if (options.headers === undefined) {
            options.headers = {};
        }

        if (!options.headers.Authorization) {
            var jwt = sessionStorage.getItem('accessToken');
            jqXHR.setRequestHeader('Authorization', 'Bearer ' + jwt);
        }
    }
});

Я полностью осознаю, что могу использовать beforeSend для установки заголовков, но я хотел сделать это, сначала проверив, существует ли заголовок,а если нет, то добавьте его, и единственный способ прочитать заголовки запросов перед их отправкой - это использовать, насколько я понимаю, ajaxPrefilter.

Я мог бы просто использовать beforeSend, но мне стало любопытно, почему это не работает так, как описано в документации?Может быть, я не совсем понимаю, как это работает ...

Я использую jQuery версии 3.3.1.

РЕДАКТИРОВАТЬ:

Этопохоже, что установка async: false устраняет проблему, но это похоже на ошибку в jQuery.

РЕДАКТИРОВАТЬ 2:

Я думаю, что у меня, возможно, была какая-то ошибкагде-то, потому что теперь код выше работает.Я понятия не имею, где могла быть эта ошибка, потому что она не очевидна, глядя на мои изменения в git, но пока работает ...

1 Ответ

0 голосов
/ 17 октября 2018

Этот способ должен работать (в $.ajaxPrefilter, в ваших условиях):

options.beforeSend = function (xhr) { 
  xhr.setRequestHeader('Authorization', 'Bearer ' + jwt);
}

Однако я не совсем уверен, почему вы не можете просто установить их на jqXHR, чтобычестны.Мне это тоже кажется логичным.

Ваш код становится:

$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
  if (options.url.startsWith('api') || options.url.startsWith('/api')) {

    if (options.headers === undefined) {
      options.headers = {};
    }

    if (!options.headers.Authorization) {
      var jwt = sessionStorage.getItem('accessToken');
      options.beforeSend = function(xhr) {
        xhr.setRequestHeader('Authorization', 'Bearer ' + jwt);
      }
    }
  }
});
...