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