Сегментация ответов AJAX в Perl CGI? - PullRequest
4 голосов
/ 28 июля 2010

Может ли скрипт perl cgi сегментировать свои ответы AJAX на многочисленные отдельные ответы HTTP?

Скажите, у меня есть этот код:

xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function()
{
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
        onDataReceived(xmlhttp.responseText);
    }
    else if(xmlhttp.status!=200 && xmlhttp.status!=0) {    }
}
xmlhttp.open("POST","script.cgi",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send(toURLString(options));

как javascript (не говорите мне о проблемах совместимости объектов xml с т. Е. Я знаю, и мне все равно).

и это:

print "Content-type: text/html\n\n";

my %form = Vars();
if($ENV{REQUEST_METHOD} eq "POST" )
{
    $|=1;
    for(my $i, (1..100000000))
    {
        print "1\n";
    }
}

как perl cgi. Можно ли распечатать этот результат в многочисленных отдельных пакетах по 1 с вместо генерации 100000000 1 с, прежде чем, наконец, будет выводиться?

1 Ответ

1 голос
/ 28 июля 2010

Пожалуйста, посмотрите этот SO вопрос о возможных подходах, хотя он не специфичен для Perl:

Работа с добавочным ответом сервера в AJAX (в JavaScript)

Из ссылки на статью в вики эта ссылка кажется наиболее актуальной: http://en.wikipedia.org/wiki/Comet_%28programming%29#XMLHttpRequest

Тем не менее, я бы настоятельно рекомендовал рассмотреть подход с опросом вместо "серверного", который вы рассматриваете :

Сервер хранит порции данных в виде доступных файлов (с некоторой метаинформацией порядка)

print "Location: xxxx"; 
# Sorry, forgot the exact form of Location HTTP response.
# Location points to URL mapped to /home/htdocs/webdocs/tmp/chunk_0.html
my %form = Vars();
if($ENV{REQUEST_METHOD} eq "POST" )
{
    $|=1;
    $file_num = 0;
    my $fh;
    for(my $i, (1..100000000))
    {
        if ($i % 1000 == 0) {
            close $fh if $fh;
            open $fh, ">", "/home/htdocs/webdocs/tmp/chunk_${file_num}.html";
            # Add the usual error handling on open/close i'm too lazy to type
            $file_num++;
        }
        print $fh "1\n";
    }
    print $fh "\n##############END_TRANSMISSION__LAST_FILE####################\n";
    # This was a singularly dumb way of marking EOF but you get the drift
    close $fh;
}

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

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