2014-04-05 65 views
3

即時響應我有一個網站運行的舞者。Perl的舞者:在後

在這個網站,我有一個textarea的形式,並寫在這個文本區域的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結束,返回模板

如何能夠做到這樣呢?

回答

3

遺憾的是沒有沒有儘快收到第一個響應並顯示每個進程的瀏覽器相同的頁面加載內返回結果的模板的方式。您想爲此使用Ajax。表單將通過Ajax發佈到您的路線,並通過Ajax呼叫處理返回數據。這些數據通常採用JSON格式,而對於Ajax路由,Dancer有很大的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; 

    } 
}; 

接下來創建它只是提供了包括形式和AJAX處理程序模板GET請求路由給最終用戶。請注意,這可以與上述路線命名相同,但它必須位於路線鏈中的AJAX路線之後。 AJAX的處理程序將通過這條線路,當用戶訪問網址的請求頭X-要求,隨着不相等的XMLHttpRequest(AJAX調用)

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

最後,你將包括腳本標籤內Javascript您的模板包含Ajax處理程序。 Ajax處理程序將解析表單輸入文本區域中的信息,並將每行作爲單獨的Ajax調用發送並等待響應。一旦它接收到該輸入行的響應,它就會在JSON對象中返回數據,並且可以在頁面上呈現它。這將持續到每個Ajax調用返回所需的數據。

+0

謝謝!你的回覆讓我以正確的方式:) – user3452713