Perl Dancer:在帖子中即时回复

时间:2014-04-05 16:12:51

标签: forms perl dancer

我有一个运行Dancer的网站。

在这个网站上,我有一个带有一个textarea的表单,以及在这个textarea中写的foreach行,当表单通过post提交时,我会为它做一些操作。 每行开始一个过程,需要一些时间(取决于行,过程可能需要大约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结束,才能返回模板

我怎样才能达到这样的目标?

1 个答案:

答案 0 :(得分:3)

不幸的是,一旦收到第一个响应并且在浏览器上显示同一页面内的每个进程的结果,就没有办法返回模板。您想使用Ajax。表单将通过Ajax发布到您的路由并通过Ajax调用处理返回数据。这些数据通常是JSON格式的,Dancer对于Ajax路由有很好的plugin

如果您使用此方法,则首先构建表单将发布到的基于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处理程序将传递给此路由,因为请求标头X-Requested-With不等于XMLHttpRequest(AJAX Call)

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

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