С нами с 05.06.09
Сообщения: 6
|
Добавлено: 11/07/09 в 11:50 |
Люди добрые, поможите кто знает ajax.
Каким образом обеспечить непрерывную подгрузку данных с сервера по ajax, пока серверный скрипт продолжает работать?
Когда скрипт прекратил работать - тут нет проблем.
Код: |
req = new XMLHttpRequest();
req.onreadystatechange = Req;
function Req() {
if (req.readyState == 4) {
var text=req.responseText;
document.getElementById('div').innerHTML=text;
}}
|
Дело в том, что функция Req активизируется только тогда, когда
req.readyState == 4 (completed)
т.е когда скрипт на сервере прекратил работать. До этого момента в браузере ничего не происходит.
Это нужно к примеру при проверке списка прокси-серверов. Пока серверный скрипт не отработает весь список, в броузере ничего не происходит и только потом начинается выгрузка в броузер.
Как сделать, чтобы видеть данные в процессе работы скрипта?
(Серверный скрипт написан на perl, хотя клиентскому java-скрипту думаю по-барабану что там работает на сервере)
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 11/07/09 в 12:18 |
аякс не при чем, меняйте тот скрипт, который данные выдает. Пускай буфер сразу скидывает, а не держит.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
0
|
|
|
С нами с 05.06.09
Сообщения: 6
|
Добавлено: 11/07/09 в 12:31 |
Все это я перепробывал. Серверный скрипт конечно же ничего не копит в буфере, а сразу выводит в выходной поток. При этом с клиентском скрипте нужно заменить 4 на 3
if (req.readyState == 3) { }
В этом случае firefox худо-бедно выводит промежуточне результаты, да и то, когда сам пожелает, а IE на 3 не реагирует, и ждет исключительно comleted (4).
При этом очевидно, что решение существует. К примеру на каком-нибудь хостерском сайте при проверке домена на сервере тоже работает тяжелый скрипт, однако в браузер (в любой) они успешно выводят промежуточные результаты.
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 11/07/09 в 13:08 |
Ты аяксом хочешь запросить скрипт и сразу выводить то, что он выводит скажем в течении минут 10 ? Может легче тогда запрашивать маленькие кусочки и их через document.write дописывать.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
0
|
|
|
Мотиватор :)
С нами с 06.05.09
Сообщения: 3028
Рейтинг: 607
|
Добавлено: 11/07/09 в 14:56 |
Разбей весь список на кусочки, например так:
Код: | <div id="div1"></div>
<div id="div2"></div>
<div id="div3"></div>
<div id="div4"></div>
<div id="div5"></div>
<script type="text/javascript">
function ajaxLoad(n)
{
var req = new JsHttpRequest();
req.onreadystatechange = function()
{
if (req.readyState == 4)
{
document.getElementById('div'+n).innerHTML = req.responseText;
}
}
req.open('GET', 'ajax_load_data.php', true);
req.send( { 'n': n } );
}
// вызываем эту хрень
for (var i=0; i<5; i++)
{
ajaxLoad(i);
}
</script>
|
у меня подобное используется в админке одного из проектов. а можно сделать и последовательный вывод через setTimeout().
|
|
|
|
С нами с 05.12.99
Сообщения: 342
Рейтинг: 323
|
Добавлено: 11/07/09 в 16:10 |
iframe используй
|
|
|
|
Мотиватор :)
С нами с 06.05.09
Сообщения: 3028
Рейтинг: 607
|
Добавлено: 11/07/09 в 16:20 |
Cook писал: |
iframe используй
|
некрасиво и непрофессионально
|
|
|
|
С нами с 26.02.03
Сообщения: 2366
Рейтинг: 987
|
Добавлено: 11/07/09 в 17:18 |
Prizma писал: | Каким образом обеспечить непрерывную подгрузку данных с сервера по ajax, пока серверный скрипт продолжает работать? |
Если нет возможности разбить работу серверного скрипта на маленькие кусочки, то можно сделать что бы он скидывал свои результаты работы во временный файлы, а уже через ajax получать эти результаты.
В твоем примере, где самым продолжительным этапом будет запрос на прокси и ожидание от него ответа, можно сделать что результат проверки скидывается в файл в формате:
0-0
1-0
2-1
где первый столбик это нормер урла в списке, а второй это результат проверки: 0-прокси не рабочий, 1- рабочий.
Естественно получить такой файл это несколько секунд. Делаешь его запрос раз в 30 секунд и полученные результаты выводишь.
Конечно можно поизгаляться с удалением проверенных данных и тд и тп, но тут главное не переборщить, а то ФФ жрущий 1,5 гб оперативки и 60% процесорных ресурсов немного напрягает
|
|
|
|
С нами с 27.03.09
Сообщения: 155
Рейтинг: 320
|
Добавлено: 12/07/09 в 18:43 |
слегка не в тему конечно - тс уходи от написания аяксовых элементов вручную и переходи на нормальные фреймворки благо их достаточно - тот же jQ
|
|
|
|
С нами с 05.06.09
Сообщения: 6
|
Добавлено: 12/07/09 в 18:52 |
В общем, решил проблему. Спасибо всем за советы, а особенно Cibtor++
- надоумил.
Одновременно запускаем на сервере два скрипта.
Один (рабочий) решает основную задачу и результаты сбрасывает в файл.
Второй (считывающий) скрипт просто считывает этот файл с заданным интервалом и выводит его в браузер по ajax.
Цикл считывания заканчивается, когда в тексте файла обнаруживается некое "конечное" слово (***END***).
Вот здесь рабочий макет http://group2002.h18.ru/ajax_2.htm Там же приведены простейшие тексты клиентского и серверного скрипта (perl).
|
|
|
|
С нами с 15.03.08
Сообщения: 33
Рейтинг: 96
|
Добавлено: 14/07/09 в 14:12 |
Несколько поздновато но хочу предложить топикстартеру посмотреть на Ajax Push - это примерно то что требовалось. Довольно подробное описание и пример реализации можно почитать вот здесь, в комментариях есть интересные мысли о том как это реализуется без применения APE.
|
|
|
|