Uzun yoklama diğer AJAX çağrıları kilitleme

0 Cevap php

Ben müşteriye aşağı bazı verileri "itmek" için uzun yoklama yapmak için arıyorum ve ben de diğer alakasız AJAX yapıyorum uzun yoklama ile paralel olarak sunucuya çağırır. Bu uzun anket bir yanıt (bir tepki ya da zaman aşımı ya) aldı kadar benim diğer AJAX çağrıları tamamlamak olmaz anlaşılmaktadır. Ben JavaScript adım, bu 2. AJAX isteği uygun zamanda gönderilir ediliyor, ancak uzun anket isteği bir yanıt alıncaya kadar tepki alınmadığı anlaşılmaktadır. Herhangi bir fikir ne oluyor?

İşte uzun yoklama bölümü için kodu:

Sunucu tarafı:

    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';
  }

 }

İstemci tarafı:

function checkForChangesOnServer() {
 $.post('/getResultsIfChanged/' + playlist_id + '/' + $('#sortable_tracks').children().size(), function(results) {

  if(results == 'false') {
   //alert('no change');
  } else {
   //alert('change');
  }

  checkForPlaylistChangesOnServer();

 });
}

Ve başka bir AJAX çağrısı bir örnek:

Sunucu tarafı:

    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');
 }

İstemci tarafı:

    function loadLibraryResultsForLetter(letter) {
 highlightLetterFilter(letter);

 $.post('/getLibraryTracksStartingWithLetter/' + user_id + '/' + letter, function(results) {
  updateLibraryResults(results);
 });
}

0 Cevap