长轮询锁定其他AJAX调用 [英] Long polling locking up other AJAX calls
问题描述
我想要长时间轮询推一些数据到客户端,我也进行其他不相关的AJAX调用服务器并行与长轮询。看起来,我的其他AJAX调用将不会完成,直到长轮询接收到响应(响应或超时)。当我浏览Javascript时,看起来第二个AJAX请求是在适当的时间发送的,但是直到长轮询请求获得响应才会收到响应。
I'm looking to do long polling to "push" some data down to the client and I'm also making other unrelated AJAX calls to the server in parallel with the long polling. It appears that my other AJAX calls won't complete until the long poll has received a response (either from a response or timeout). When I step through the Javascript, it appears that the 2nd AJAX request is being sent at the proper time, but the response isn't being received until the long poll request gets a response. Any idea what is going on?
这是长轮询部分的代码:
Here is the code for the long polling portion:
服务器端:
function getPlaylistTracksIfChanged($playlist_id, $numClientTracks) {
$reportChange = false;
for($i = 0; $i < 10; $i++) {
$numServerTracks = $this->PlaylistTrack->find('count', array(
'conditions' => array('playlist_id' => $playlist_id)
)
);
if($numClientTracks != $numServerTracks) {
$reportChange = true;
break;
}
sleep(3);
}
if($reportChange) {
$playlist_tracks = $this->PlaylistTrack->find('all', array(
'conditions' => array('playlist_id' => $playlist_id),
'order' => array('PlaylistTrack.position')
)
);
$this->set('playlist_tracks', $playlist_tracks);
$this->layout = false;
$this->render('show_playlist_tracks_list');
} else {
$this->autoRender = false;
return 'false';
}
}
客户端:
function checkForChangesOnServer() {
$.post('/getResultsIfChanged/' + playlist_id + '/' + $('#sortable_tracks').children().size(), function(results) {
if(results == 'false') {
//alert('no change');
} else {
//alert('change');
}
checkForPlaylistChangesOnServer();
});
}
另一个AJAX调用示例:
And a sample of another AJAX call:
服务器端:
function getLibraryTracksStartingWithLetter($user_id, $letter) {
$results = $this->Track->find(
'all',
array(
'conditions' => array(
'user_id' => $user_id,
'OR' => array(
'Track.artist LIKE' => $letter . '%',
'Track.name LIKE' => $letter . '%'
)
),
'order' => array('case when Track.artist = "" then 1 else 0 end', 'Track.artist', 'Track.name')
)
);
$this->set('results', $results);
$this->layout = false;
$this->render('show_library_results_list');
}
客户端:
function loadLibraryResultsForLetter(letter) {
highlightLetterFilter(letter);
$.post('/getLibraryTracksStartingWithLetter/' + user_id + '/' + letter, function(results) {
updateLibraryResults(results);
});
}
推荐答案
文件锁定
执行 session_write_close()
(或cakephp中的相应函数) ajax端点。
Perform session_write_close()
(or corresponding function in cakephp) to close the session in the begin of the ajax endpoint.
这篇关于长轮询锁定其他AJAX调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!