我有一个运行 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/