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

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

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

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


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

Другие вопросы по тегам