Возможно ли прочитать AJAX-запрос до завершения ответа? - PullRequest
10 голосов
/ 13 июля 2011

У меня есть запрос ajax, выполнение которого занимает некоторое время, но сервер действительно выводит некоторое содержимое по пути. Если я загружаю запрос просто в браузере, я вижу, что страница медленно загружается, и она может быть остановлена ​​в любое время. Можно ли получить доступ к неполному запросу ajax до того, как сервер закроет ответ?

Ответы [ 6 ]

6 голосов
/ 25 июля 2011

Способ сделать это - прослушать readyState в объекте xhr. Когда readyState == 3, это означает, что новый контент прибыл, и вы можете получить к нему доступ. Техника называется комета.

Обратите внимание, что разные браузеры ведут себя здесь по-разному, IE не позволит вам получить к нему доступ См. Здесь , и браузеры Webkit (Chrome / Safari) буферизуют 2 КБ данных, прежде чем сделать их доступными. Однако, после учета этого, вы можете выслушать изменение, а затем действовать на него.

К сожалению, jQuery в настоящее время не поддерживает это из коробки. Вы можете обойти это, как отмечено в Ошибка # 8327 , где они в основном возвращаются к опросу на ReadyState, чтобы увидеть, если он изменится. У них есть планы, возможно, сделать что-нибудь с этим в будущем, Ошибка # 9883 , но не задерживайте дыхание.

Итак, наконец, да, это возможно, нет, это не легко.

2 голосов
/ 25 июля 2011

Уже есть несколько хороших ответов, но ни один из них не является на 100% надежным или кросс-браузерным. Более безопасный подход, вероятно, состоит в том, чтобы разделить ваш ответ на «страницы». Каждый запрос может указывать что-то эквивалентное LIMIT и OFFSET, и вы продолжаете делать запросы, пока не получите пустой ответ. Это влечет за собой дополнительные издержки как на клиенте, так и на сервере, но это будет более надежным.

1 голос
/ 25 июля 2011

Взято из: /213644/jquery-vozmozhno-li-req-readystate-3 3-х возможных

Назначьте вызов ajax переменной и прикрепите событие к ее readystatechanged.

var xhr = $.ajax(...);

xhr._onreadystatechange = xhr.onreadystatechange;

xhr.onreadystatechange = function() {
    xhr._onreadystatechange();
    if (xhr.readyState == 3) alert('Interactive');
};
0 голосов
/ 25 июля 2011

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

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


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

0 голосов
/ 25 июля 2011

Можете ли вы использовать длинный опрос (комету) вместо ajax? Затем вы можете очистить выходные буферы и прочитать содержимое во время обработки запроса.

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

0 голосов
/ 13 июля 2011

Не знаю точно, сработает ли это, но стоит попробовать:

$.ajax({
  statusCode: {
    206: function() { // 206 is partial content
      // do work
    }
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...