У меня есть запрос ajax, который занимает некоторое время, но сервер выводит некоторое содержимое на этом пути. Если я загружаю запрос просто в браузере, я могу медленно его загружать и его можно остановить в любое время. Возможно ли получить доступ к незавершенному запросу ajax до того, как сервер закроет ответ?
Возможно ли, чтобы запрос AJAX был прочитан до завершения ответа?
Ответ 1
Способ достижения этого - прослушивание readyState в объекте xhr. Когда readyState == 3, это означает, что появился новый контент, и вы можете получить к нему доступ. Эта техника называется кометами.
Заметьте, однако, что разные браузеры ведут себя по-другому здесь, IE не позволит вам получить к нему доступ См. здесь и буфер веб-браузера (Chrome/Safari) 2KB данных перед тем, как сделать он доступен. После учета этого, однако, вы можете прослушать изменение, а затем действовать на нем.
К сожалению, jQuery в настоящее время не поддерживает это из коробки. Вы можете обойти это, как указано в Bug # 8327, где они в основном возвращаются к опросу на ReadyState, чтобы узнать, меняется ли он. У них есть планы, возможно, что-то сделать в будущем, Ошибка # 9883, но не задерживайте дыхание.
Итак, наконец, да, возможно, нет, это непросто.
Ответ 2
Уже есть хорошие ответы, но ни один из них на самом деле не на 100% надежный или кросс-браузер. Более безопасный подход, вероятно, заключался бы в том, чтобы вырезать ваш ответ на "страницы". Каждый запрос может указать что-то, эквивалентное LIMIT
и OFFSET
, и вы продолжаете делать запросы, пока не получите пустой ответ. Это накладывает дополнительные накладные расходы как на клиента, так и на сервер, но будет более надежным.
Ответ 3
Взято из: https://stackoverflow.com/questions/287286/jquery-is-req-readystate- 3 - возможно
Назначьте свой вызов ajax переменной и присоедините событие к своему readystatechanged
.
var xhr = $.ajax(...);
xhr._onreadystatechange = xhr.onreadystatechange;
xhr.onreadystatechange = function() {
xhr._onreadystatechange();
if (xhr.readyState == 3) alert('Interactive');
};
Ответ 4
Я точно не знаю, будет ли это работать, но стоит попробовать:
$.ajax({
statusCode: {
206: function() { // 206 is partial content
// do work
}
}
});
Ответ 5
Можно ли использовать длинный опрос (комету) вместо ajax? Затем вы можете очистить выходные буферы и прочитать содержимое по мере обработки запроса.
Ответ 6
Comet является хорошим обходным решением прямо сейчас, но он будет заменен на WebSockets в ближайшем будущем.
Конечно, WebSockets не поддерживаются готовыми к использованию со многими обычными веб-браузерами, но уже существует ряд polyfills, которые имитируют функциональность в браузерах с тусклым обрамлением, многие из которых полагаются на комету (длинный опрос XHR) под капотом, чтобы имитировать функциональность.
Лично я предпочитаю socket.io polyfill, но мой опыт работы с ним ограничен использованием node.js, который может или не может хорошо сшиваться с тем, с чем вы работаете.