在If-Else / While

时间:2016-01-29 18:52:37

标签: ajax perl session cgi

下面的代码有一个AJAX调用,它启动一个if语句,并从最后存储的会话参数+10开始计数。

另一个AJAX调用立即开始轮询当前会话参数的form.cgi。

我希望会话参数根据时间条件每秒更新一次,因此我应该一次增加一个数字流。 (轮询代码也以一秒为增量运行)。

这是我对网络浏览器控制台的期望,每隔1秒钟就会出现一次:

1,2,3,4,5,6,7,8,9,10,11...(press submit again)...12,13,14,15...etc..

问题是从轮询AJAX调用返回的值仅每次循环更新一次(每10秒)

1,1,1,1,1,1,1,1,1,1,10,10, (press submit again)...10,10,10,10,10...

当If和While完成时,似乎只将会话变量提交给服务器存储。

有解决方法吗?我计划使用If语句运行许多系统脚本,并希望能够轮询form.cgi以获取更新,而不必等到所有操作都完成。

form.cgi

#!/usr/bin/perl

use strict;
use warnings;

use CGI;
use CGI::Carp 'fatalsToBrowser'; # sends error messages to the browser!
use CGI::Session;
use JSON;

my $workTimer = 1; # In milliseconds.

my $query = CGI->new();
my $session = CGI::Session->new($query);
print $session->header();

if(defined $query->param('name')){

    my $sec = time();
    my $count = $session->param('script1');
    my $max = $count + 10;

    while($count < $max){
        if(time() > $sec + $workTimer){
            $count = $session->param('script1');
            $count = $count + 1;
            $session->param('script1', $count);
            $sec = time();
        }
    }

    print "While finished.";
}
elsif(defined $query->param('polling')){
    my @pollingArray = ();

    push(@pollingArray, $session->param('script1'));

    my $json->{"poll-reply"} = \@pollingArray;
    my $json_text = to_json($json);

    print "$json_text";
}
else{
    print <<"EOF";
<html><head>
        <script src="jquery-2.2.0.min.js" defer></script>
        <script src="app.js" defer></script>
</head><body>
EOF

    # Print the form area.
    print <<"EOF";
    <form id="test-form">
        <input type="submit" name="submit" id="submit"/>
    </form>
EOF

    # Print the bottom of the HTML page.
    print <<"EOF";
    </body>
</html>
EOF

}

app.js

$('#submit').on("click", function(e){
    e.preventDefault();
    $.ajax({
        url: "/form/form.cgi",
        type: "post",
        data: {
            name: "-"
        },
        success: function(data){
            console.log(data);
        }
    });
    var polling = pollingForStatus();
});

function pollingForStatus(){
    return window.setInterval(function(){ 
        $.ajax({
            url: "/form/form.cgi",
            type: "post",
            data: {
                polling: "poll"
            },
            success: function(data){
                console.log(data);
            }
        }); 
    }, 1000);
}

1 个答案:

答案 0 :(得分:2)

在对要在当前请求之外显示的会话进行更新后,尝试调用flush()。

请参阅https://metacpan.org/pod/CGI::Session#flush