【问题标题】:Perl Dancer: Instant response in postPerl Dancer:帖子中的即时响应
【发布时间】:2014-04-05 16:12:50
【问题描述】:

我有一个运行 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 结束,才能返回模板

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

【问题讨论】:

    标签: forms perl dancer


    【解决方案1】:

    不幸的是,没有办法在您收到第一个响应后立即返回模板,并在浏览器上加载同一页面时显示每个进程的结果。您想为此使用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 处理程序将传递到此路由,因为请求标头 X-Requested-With 不等于 XMLHttpRequest(AJAX 调用)

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多