Je cherche à faire une longue interrogation pour "pousser" des données vers le client et je fais également d'autres appels AJAX sans rapport avec le serveur en parallèle avec la longue interrogation. Il semble que mes autres appels AJAX ne se termineront pas tant que le sondage long n'aura pas reçu de réponse (réponse ou expiration). Lorsque je parcours le Javascript, il apparaît que la deuxième requête AJAX est envoyée au bon moment, mais la réponse n'est pas reçue tant que la demande d'interrogation longue n'a pas reçu de réponse. Une idée de ce qui se passe?Interrogation longue verrouillant d'autres appels AJAX
Voici le code pour la partie longue de vote:
côté serveur:
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';
}
}
côté client:
function checkForChangesOnServer() {
$.post('/getResultsIfChanged/' + playlist_id + '/' + $('#sortable_tracks').children().size(), function(results) {
if(results == 'false') {
//alert('no change');
} else {
//alert('change');
}
checkForPlaylistChangesOnServer();
});
}
Et un échantillon d'un autre appel AJAX:
Côté serveur:
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');
}
côté client:
function loadLibraryResultsForLetter(letter) {
highlightLetterFilter(letter);
$.post('/getLibraryTracksStartingWithLetter/' + user_id + '/' + letter, function(results) {
updateLibraryResults(results);
});
}
ne savait pas à ce sujet trucs cool – RageZ
@RageZ: chaque développeur php doit prendre ce problème :-) – zerkms
du sens maintenant, je pense à ce – RageZ