|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
31.10.2016, 05:16 | #1 |
Пользователь
Регистрация: 06.05.2010
Сообщений: 32
|
Промежуточный ответ ajax
Доброго времени суток.
Передаю серверу данные используя XMLHttpRequest. После получения результата типа: PHP код:
Но скрипт на сервере достаточно долго работает. Хотелось бы получить какие-нибудь промежуточные сообщения типа (Начинаю..., 10%, 50%, Заканчиваю) и отображать их на экране. Подскажите пожалуйста можно ли это сделать, если да то как? Вот обработка со стороны клиента: Код:
PHP код:
|
31.10.2016, 14:37 | #2 | |
Форумчанин
Регистрация: 01.08.2016
Сообщений: 182
|
Цитата:
На хабре расписывали прогресс-бар на аяксе, можно погуглить "прогресс-бар на ajax" и доработать понравившуюся идею под свои нужды. |
|
01.11.2016, 05:26 | #3 |
Пользователь
Регистрация: 06.05.2010
Сообщений: 32
|
Вопрос такой. Как я понял для продолжения приёма данных с сервера вы используете xhr.readyState == 3?
А моя ошибка заключалась в том, что я это пихал в xhr.readyState == 4? И второй вопрос. С 3 Interactive (xhr.readyState == 3) у браузеров проблем не возникает? В особенности, что касается IE? |
01.11.2016, 06:41 | #4 | |
Форумчанин
Регистрация: 01.08.2016
Сообщений: 182
|
Я всегда использую readyState = 4, и по получении данных, по таймеру через 1-2 сек отправляю следующий xhr-запрос за новой порцией данных.
В Интернетах пишут, что с readyState = 3 возникают проблемы: Цитата:
|
|
01.11.2016, 07:25 | #5 |
Пользователь
Регистрация: 06.05.2010
Сообщений: 32
|
Да, но в приведённой вами статье используется именно readyState == 3?
Я наверно что-то не до понял. Вот как я делаю: 1. Клиент отправляет данные; 2. Сервер обрабатывает их на первом этапе; 3. Сервер шлёт ответ и приступает к выполнению второго этапа не дожидаясь команды от клиента; 4. Клиент тем временем ловит сообщение о пройденном первом этапе; 5. И тут то соединение получается закрылось!? А надо, что-бы клиент ждал следующего сообщения от сервера (пройден этапа 2, 3 и т.д.) ничего ему не пересылая! Возможно ли это? В приведённой вами статье говорится что да, но readyState == 3? |
03.11.2016, 14:47 | #6 |
Раздолбайских Дел
Старожил
Регистрация: 22.05.2009
Сообщений: 3,828
|
В классическом AJAX клиент посылает запрос и получает ответ и все на этом.
Чтобы порционно получать данные, надо либо пинговать сервер (дедовский способ), либо устанавливать двустороннее соединение (webSocket, стильно, модно, молодежно). Либо ждать окончательного ответа сервера (longpoll, тоже древний метод).
Alar, верни репу!
|
04.11.2016, 18:54 | #7 | |
Форумчанин
Регистрация: 01.08.2016
Сообщений: 182
|
OliverVood, это просто рабочий пример реализации с Хабра. С readyState = 3 возникает всего одна проблема - пока вы ждёте очередной порции данных от сервера - вы не можете определить оборвался канал или нет.
Поэтому ваш алгоритм должен работать вполне нормально (за исключение каммента выше), только надо найти кто и почему рвёт соединение. Цитата:
Вы точно на сервере не делаете exit() или "Connection: close" в headers? И для протокола HTTP 1.0 надо посылать заголовки "Connection: Keep-Alive". В HTTP 1.1 все соединения считаются постоянными, если не обозначено иное. НО время ожидания по умолчанию в httpd для Apache 1.3 и 2.0 составляет всего 15 секунд, а для Apache 2.2 и 2.4 лишь 5 секунд. После этого соединение рвёт сам сервер. Не забудьте отключить буферизацию сервером. В связке Apache/PHP - отключите output buffering и включите ob_implicit_flush: PHP код:
PS: Если нет желания лезть вглубь, ходить по граблям и разбираться с нюансами реализации постоянных соединений - вот тут есть обзор существующих технологий передачи данных по инициативе сервера, обзор COMET - по сути то, что кратко сказал Naive. Берёте готовое решение, зная его + и - и избегаете "головных болей". Последний раз редактировалось predefined; 04.11.2016 в 18:57. |
|
04.11.2016, 22:31 | #8 |
Пользователь
Регистрация: 06.05.2010
Сообщений: 32
|
Попробую, спасибо за ответ.
|
05.11.2016, 18:39 | #9 |
Форумчанин
Регистрация: 01.08.2016
Сообщений: 182
|
Там по ссылке в статье с Хабра есть полный набор нужных заголовков:
PHP код:
Последний раз редактировалось predefined; 05.11.2016 в 18:41. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
AJAX, PERL, запись в файл и неожиданный ответ от сервера | Jopses | JavaScript, Ajax | 0 | 28.02.2013 13:06 |
Аналог COMPUTE, ROLLUP или как сделать промежуточный итог | googl | Microsoft Office Access | 14 | 19.01.2012 16:52 |
AJAX - не подгружается ответ | max38934 | JavaScript, Ajax | 17 | 19.05.2009 22:34 |
переместить память из TMemoryStream в промежуточный буфер и в буфере найти слова | Дядя Фёдор | Общие вопросы Delphi | 2 | 02.10.2007 00:20 |