Возможно ли, чтобы запрос 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? Затем вы можете очистить выходные буферы и прочитать содержимое по мере обработки запроса.

http://www.zeitoun.net/articles/comet_and_php/start

Ответ 6

Comet является хорошим обходным решением прямо сейчас, но он будет заменен на WebSockets в ближайшем будущем.

Конечно, WebSockets не поддерживаются готовыми к использованию со многими обычными веб-браузерами, но уже существует ряд polyfills, которые имитируют функциональность в браузерах с тусклым обрамлением, многие из которых полагаются на комету (длинный опрос XHR) под капотом, чтобы имитировать функциональность.


Лично я предпочитаю socket.io polyfill, но мой опыт работы с ним ограничен использованием node.js, который может или не может хорошо сшиваться с тем, с чем вы работаете.