Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Ajax и сложные серверные запросы
цитата
11/07/09 в 11:50
 Prizma
Люди добрые, поможите кто знает 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-скрипту думаю по-барабану что там работает на сервере)
цитата
11/07/09 в 12:18
 Stek
аякс не при чем, меняйте тот скрипт, который данные выдает. Пускай буфер сразу скидывает, а не держит.
цитата
11/07/09 в 12:31
 Prizma

Все это я перепробывал. Серверный скрипт конечно же ничего не копит в буфере, а сразу выводит в выходной поток. При этом с клиентском скрипте нужно заменить 4 на 3
if (req.readyState == 3) { }
В этом случае firefox худо-бедно выводит промежуточне результаты, да и то, когда сам пожелает, а IE на 3 не реагирует, и ждет исключительно comleted (4).
При этом очевидно, что решение существует. К примеру на каком-нибудь хостерском сайте при проверке домена на сервере тоже работает тяжелый скрипт, однако в браузер (в любой) они успешно выводят промежуточные результаты.
цитата
11/07/09 в 13:08
 Stek
Ты аяксом хочешь запросить скрипт и сразу выводить то, что он выводит скажем в течении минут 10 ? Может легче тогда запрашивать маленькие кусочки и их через document.write дописывать.
цитата
11/07/09 в 14:56
 alex.raven
Разбей весь список на кусочки, например так:
Код:
<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().
цитата
11/07/09 в 16:10
 Cook
iframe используй
цитата
11/07/09 в 16:20
 alex.raven
Cook писал:

iframe используй


некрасиво и непрофессионально
цитата
11/07/09 в 17:18
 Cibtor
Prizma писал:
Каким образом обеспечить непрерывную подгрузку данных с сервера по ajax, пока серверный скрипт продолжает работать?
Если нет возможности разбить работу серверного скрипта на маленькие кусочки, то можно сделать что бы он скидывал свои результаты работы во временный файлы, а уже через ajax получать эти результаты.
В твоем примере, где самым продолжительным этапом будет запрос на прокси и ожидание от него ответа, можно сделать что результат проверки скидывается в файл в формате:
0-0
1-0
2-1
где первый столбик это нормер урла в списке, а второй это результат проверки: 0-прокси не рабочий, 1- рабочий.
Естественно получить такой файл это несколько секунд. Делаешь его запрос раз в 30 секунд и полученные результаты выводишь.
Конечно можно поизгаляться с удалением проверенных данных и тд и тп, но тут главное не переборщить, а то ФФ жрущий 1,5 гб оперативки и 60% процесорных ресурсов немного напрягает icon_smile.gif
цитата
12/07/09 в 18:43
 Scheme
слегка не в тему конечно - тс уходи от написания аяксовых элементов вручную и переходи на нормальные фреймворки благо их достаточно - тот же jQ
цитата
12/07/09 в 18:52
 Prizma
В общем, решил проблему. Спасибо всем за советы, а особенно Cibtor++
- надоумил.
Одновременно запускаем на сервере два скрипта.
Один (рабочий) решает основную задачу и результаты сбрасывает в файл.
Второй (считывающий) скрипт просто считывает этот файл с заданным интервалом и выводит его в браузер по ajax.
Цикл считывания заканчивается, когда в тексте файла обнаруживается некое "конечное" слово (***END***).
Вот здесь рабочий макет http://group2002.h18.ru/ajax_2.htm Там же приведены простейшие тексты клиентского и серверного скрипта (perl).
цитата
14/07/09 в 14:12
 flying
Несколько поздновато icon_smile.gif но хочу предложить топикстартеру посмотреть на Ajax Push - это примерно то что требовалось. Довольно подробное описание и пример реализации можно почитать вот здесь, в комментариях есть интересные мысли о том как это реализуется без применения APE.


Эта страница в полной версии