forms - Perl舞者: Instant response in post

标签 forms perl dancer

我有一个运行 Dancer 的网站。

在这个站点中,我有一个带有一个文本区域的表单,并且在这个文本区域中写了每一行,当通过邮寄提交表单时,我会为它做一些操作。 每行开始一个过程,需要一些时间(根据行的不同,该过程可能需要大约 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 结束,返回模板

我怎样才能实现这样的目标?

最佳答案

不幸的是,没有一种方法可以在您收到第一个响应后立即返回模板,并在浏览器的同一页面加载中显示每个过程的结果。您想为此使用 Ajax。该表单将通过 Ajax 发布到您的路线,并通过 Ajax 调用处理返回数据。此数据通常为 JSON 格式,Dancer 具有出色的 plugin对于 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 路由之后。当用户访问该 url 时,AJAX 处理程序将传递给此路由,因为请求 header X-Requested-With 不等于 XMLHttpRequest(AJAX 调用)

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

最后,您将在包含 Ajax 的模板的脚本标记中包含 Javascript处理程序。 Ajax 处理程序将解析来自表单输入文本区域的信息,并将每一行作为单独的 Ajax 调用发送并等待响应。一旦它收到该输入行的响应,它就会在 JSON 对象中获得返回数据,您可以将其呈现在您的页面上。这将一直持续到每个 Ajax 调用返回所需的数据。

关于forms - Perl舞者: Instant response in post,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22883383/

相关文章:

forms - Symfony2 自引用表单主题错误

Perl 舞者和模板工具包 : Including template within template

perl - 如何在不增加测试计数的情况下使用 Perl 的 Test::Deep::cmp_deeply?

html - Perl 中可扩展的类似 Markdown 的模块?

mysql - 模板工具包显示唯一行

javascript - 按回车键不会调用 HTML 表单中的 javascript 函数

PHP - 如何在表单提交后保留文本框数组的值?

python - django 中最终用户的动态表单

javascript - 1 javascript/css 问题 2 perl cgi 问题

javascript - 类型转换 perl、javascript、JSON.parse JSON::XS - 需要想法