Perl Dancer: Мгновенный ответ в сообщении

У меня есть сайт, на котором работает Dancer.

На этом сайте у меня есть форма с одним текстовым полем и строкой foreach, написанной в этом текстовом поле, когда форма отправляется по почте, я выполняю для нее какое-то действие. Каждая строка запускает процесс, и это занимает некоторое время (в зависимости от строки процесс может занять около 20 секунд, 40 секунд, 1 минуту...)

Пост примерно такой:

post '/actions/AddSrv' => sub {  
    my $self = shift;
    my @Results;
    foreach my $dest_addr ( split /\n/, params->{HostsList} ){
        #Here starts the process
        my $Result = start_some_process($dest_addr);
        push @Results, $Result;
        ##Now i have the result of this process execution
    }
    template 'actions/AddSrv.tt', { Results => [ @Results ] }, { layout => 'logged_site' };
};

с этим кодом мне нужно дождаться, пока все $dest_addr будут обработаны, чтобы просмотреть на экране результат всех выполнений. Существует ли способ немедленно распечатать результат каждого процесса, когда вызов start_some_process() завершается? Теперь мне нужно дождаться окончания foreach, чтобы вернуть шаблон

Как я могу добиться чего-то подобного?


person user3452713    schedule 05.04.2014    source источник


Ответы (1)


К сожалению, нет способа вернуть шаблон, как только вы получите первый ответ, и показать результаты каждого процесса на той же странице, загружаемой в браузере. Вы хотите использовать Ajax для этого. Форма отправит через Ajax ваш маршрут и обработает возвращаемые данные через вызов Ajax. Эти данные обычно имеют формат JSON, и Dancer имеет отличный плагин. для маршрутов Ajax.

Если вы выберете этот метод, вы сначала создадите маршрут на основе AJAX, на который будет отправлена ​​​​форма:

ajax '/actions/AddSrv' => sub {
            my $self = shift;
    my @Results;
    foreach my $dest_addr ( split /\n/, params->{HostsList} ){
        #Here starts the process
        my $Result = start_some_process($dest_addr);
        push @Results, $Result;
        ##Now i have the result of this process execution
        ## Insure your data is in a hash or array and encode to JSON
        my $json_text = to_json(\%results);
        return $json_text;

    }
};

Затем вы создаете маршрут запроса GET, который просто отправляет шаблон, включающий форму и обработчик AJAX, конечному пользователю. Обратите внимание, что это может быть названо так же, как указанный выше маршрут, но он должен быть ПОСЛЕ маршрута AJAX в цепочке маршрутов. Обработчик AJAX перейдет к этому маршруту, когда пользователь получит доступ к этому URL-адресу, поскольку заголовок запроса X-Requested-With не равен XMLHttpRequest (вызов AJAX)

get '/actions/AddSrv' => sub {  
    template 'actions/AddSrv.tt', { layout => 'logged_site' };
};

Наконец, вы добавите Javascript в теги сценария вашего шаблона, который содержит обработчик Ajax. Обработчик Ajax будет анализировать информацию из области ввода текста формы и отправлять каждую строку как отдельный вызов Ajax и ожидать ответа. Как только он получает ответ для этой входной строки, он имеет возвращаемые данные в объекте JSON, и вы можете отображать их на своей странице. Это будет продолжаться до тех пор, пока каждый вызов Ajax не вернет нужные данные.

person MattSizzle    schedule 05.04.2014