Событие 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
и / или readyState
2
при использовании оболочки 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!
}
}
};