我的框架是PHP Laravel 4.我使用长轮询技术刷新HTML页面上的列表。在同一页面中,我有一个自动提交下拉列表。当用户选择一个选项时,它只是自动提交以重置会话值。重置后会话页面将刷新。但这里有一个错误。我什么时候开始轮询会话没有正确更新。有时它会更新,但大部分时间都会更新。
这就是我在AJAX长轮询PHP服务器端功能中尝试做的事情
public function getNewAppt() {
//Session is open now. Connection to the server is opened. Session file is locked
//Close the session
if (session_status() != PHP_SESSION_NONE) {
session_write_close();//close
}
$today_appt_count = 0;
$result = Appointment::with(array('user' => function($query) {
$query->where('branch_id', Session::get('branch_id'));
}))->where('start', 'LIKE', date('Y-m-d') . ' %')->get();
foreach ($result as $appt) {
if ($appt->user != null) {
$today_appt_count++;
}
}
return $today_appt_count;
}
当用户更改下拉列表时,首先我会停止长轮询功能,
console.log('Long Polling has Stopped');
ajaxLongPoll.abort();//Stop the long polling function
然后我自动将html表单提交给这个php函数。
public function postChangeBranch() {
//Session is closed now, so start the session
if (session_status() == PHP_SESSION_NONE) {
session_start(); //start session again
}
Session::forget('branch_id');
Session::put('branch_id', Input::get('branch_id'));
return Redirect::to('calendar');
}
这是长轮询ajax函数
var poll = function() {
ajaxLongPoll = $.ajax({
type: 'GET',
url: 'calendar/new-appt',
dataType: 'html',
success: function(data) {
//update stuff
requestCount++;
console.log(requestCount);//number of times this function runs...
console.log(data);//this will just print a live count from DB
},
error: function(data) {
console.log(data);
},
complete: function() {
poll();// recall this function after 30 sec
},
async: true, /* If set to non-async, browser shows page as "Loading.."*/
cache: false,
timeout: 30000 /* Timeout in ms */
});
}//polling end
你可以告诉我这里我做错了什么吗?非常感谢!
答案 0 :(得分:0)
有些人建议在使用ajaxRequest.abort()提交表单之前关闭ajax请求; 检查下面。 Abort Ajax requests using jQuery 但它对我没用。
这就是我所做的,
我创建了一个名为 startPoll 的新变量,并修改了我的轮询ajax函数的完整部分,如下所示
....
complete: function() {
if(startPoll)//run only if this is true
poll();// recall this function after 30 sec
},
.....
然后在我自动提交之前(在刷新页面之前),我会将 startPoll 值设置为false,以便停止我的轮询功能。< / p>
//Long polling stop - On change the branch refresh the page
$('select[name="branch_id"]').on('change', function(e) {
e.preventDefault();
console.log('Long Polling has Stopped');
startPoll = false;
$('#auto-sub').submit();
});
最后这对我有用。希望这会对某人有所帮助。 :)