Событие readyState для HEADERS_RECEIVED с использованием jQuery.ajax

Использование родного XMLHttpRequest объект, можно добавить прослушиватель событий в onreadystatechange событие и получать уведомления, когда readyState является 2, или же HEADERS_RECEIVED, Это полезно, так как это позволяет читать заголовки ответа HTTP до завершения долгой передачи.

Однако в оболочке AJAX jQuery, похоже, нет никакого способа сделать это. Документация по API jQuery.ajax фактически говорит о следующем.

нет onreadystatechange Механизм предоставляется, однако, так как done, fail, always, а также statusCode покрыть все мыслимые требования.

Если я не ошибаюсь, все перечисленные обратные вызовы запускаются после получения всего запроса, что может занять много времени после того, как заголовки станут доступны и readyState является 2,

Есть ли способ добавить обратный вызов onreadystatechange и / или readyState2 при использовании оболочки JJuery AJAX без опроса readyState имущество?

Я полагаю, что можно было бы опросить readyState свойство объекта AJAX с использованием setInterval, но я не считаю это реальным решением по понятным причинам. Я также не считаю модификацию ядра jQuery реальным решением.

Обновить:

Другой пользователь SO направил меня на этот вопрос. К сожалению, ни один из этих ответов не работает. Модификация jQuery не является реальным решением. Использование jQuery для создания объекта XHR своего рода побеждает цель. И последний ответ не работает вообще. На самом деле весь вопрос выглядит для устаревшего jQuery.

2 ответа

Решение

Вкратце, jQuery не предоставляет эту функциональность из-за проблем совместимости в старых браузерах. Чтобы решить проблемы, jQuery просто понижает планку до наименьшего общего знаменателя.

Немного более длинный ответ, это может быть исправлено обезьяной, используя beforeSend а также xhr методы, но это не тривиально, особенно если учесть устаревшую и кросс-браузерную совместимость. Чтобы облегчить боль, я создал плагин jQuery, который делает именно это.

Кажется возможным. Получить XMLHttpRequestобъект из jQuery, затем отслеживайте изменения состояния, как описано здесь: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/onreadystatechange

Пример кода из документации:

      xhr.onreadystatechange = function () {
  // In local files, status is 0 upon success in Mozilla Firefox
  if(xhr.readyState === XMLHttpRequest.DONE) {
    var status = xhr.status;
    if (status === 0 || (status >= 200 && status < 400)) {
      // The request has been completed successfully
      console.log(xhr.responseText);
    } else {
      // Oh no! There has been an error with the request!
    }
  }
};
Другие вопросы по тегам