下面的代码有一个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);
}
答案 0 :(得分:2)
在对要在当前请求之外显示的会话进行更新后,尝试调用flush()。