Доступ к частичному ответу с использованием AJAX или WebSockets? - PullRequest
6 голосов
/ 31 октября 2011

Я использую некоторый клиентский JavaScript-код для извлечения большого количества данных JSON с веб-сервера через HTTP GET. Объем данных может быть большим, скажем, 50 МБ. Это в локальной сети, так что это не большая проблема, но это все равно занимает около десяти секунд.

Чтобы сделать мой интерфейс более отзывчивым, я бы хотел обрабатывать ответ в виде фрагментов, отображая данные в пользовательском интерфейсе, как только они становятся доступными (скажем, за МБ или за секунду). Совместимость браузера не является проблемой; Пока это работает на последних версиях Chrome и Firefox, все будет хорошо. Однако я не могу изменить код сервера.

Возможно ли это сделать, используя XMLHttpRequest или WebSockets, или какую-либо другую технологию, о которой я не слышал?

XMLHttpRequest.responseText не является явно пустым, когда состояние LOADING:

Атрибут responseText должен возвращать результат выполнения этих шагов:

  1. Если состояние не ЗАГРУЗКА или ВЫПОЛНЕНО, верните пустую строку и завершите эти шаги.
  2. Возвращает текстовое тело ответа.

Но я полагаю, что буферизация будет происходить на разных этапах, поэтому она будет работать, если я установлю таймер для периодического опроса responseText?

Насколько я могу судить, WebSockets требует специального протокола и на стороне сервера, так что его нет.

Ограничение: я не могу изменить код сервера.

1 Ответ

5 голосов
/ 31 октября 2011

Хотел опубликовать это как комментарий, но текст комментария немного ограничен

В данный момент сервер отправляет данные порциями или это один непрерывный поток?Если вы добавляете обработчик к xmlHttpRequestInstance.onreadystatechange, как часто он срабатывает?Если xmlHttpRequestInstance.readystate имеет значение 3, вы можете получить текущее значение xmlHttpRequestInstance.responseText и отслеживать длину.Когда в следующий раз изменится состояние готовности, вы можете получить самые последние данные, получив все новые данные, начиная с этой точки.

Я не проверял следующее, но, надеюсь, это достаточно ясно:

var xhr = new XMLHttpRequest();
var lastPos = 0;
xhr.onreadystatechange = function() {
  if(xhr.readystate === 3) {
    var data = xhr.responseText.substring(lastPos);
    lastPos = xhr.responseText.length;

    process(data);
  } 
};
// then of course do `open` and `send` :)

Это, конечно, зависит от события onreadystatechange.Это будет работать в IE, Chrome, Safari и Firefox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...