Domanda

Ho creato un refresh della pagina AJAX con setInterval . Di tanto in tanto, il server è così lenta che una nuova richiesta viene iniziato prima che il precedente è stato completato.

Come posso evitare questo?

È stato utile?

Soluzione

Con un valore di timeout che è più breve l'intervallo di aggiornamento. Quando il timeout della richiesta, sarà chiamare il gestore degli errori quindi è necessario distinguere tra gli errori di tempo e di altri tipi di errori nel gestore.

 $.ajax({
   type: "POST",
   url: "some.php",
   data: "name=John&location=Boston",
   timeout: 5000, /* ms or 5s */
   success: function(msg){
     alert( "Data Saved: " + msg );
   }
 });

Docs a jquery.com. Nell'esempio precedente dalla stessa sorgente, ma con valore di timeout aggiunto.

Altri suggerimenti

Usa setTimeout invece, avviare un'altra setTimeout solo dopo aver ricevuto il risultato della richiesta AJAX. In questo modo un aggiornamento avviene solo dopo il periodo specificato dall'ultimo aggiornamento.

Invece di usare un intervallo hard coded fisso: Innescare il successivo aggiornamento come ultimo passo di gestire quello attuale, ad esempio nella "Success" (o "Completa") callback di eventi.

Si potrebbe aggiungere una variabile che tiene traccia del tempo la richiesta corrente è stato inviato, in modo che è possibile calcolare un ritardo dinamica:

  1. prendere tempo corrente T1
  2. invia una richiesta asincrona
  3. altre cose succede ...
  4. richiesta asincrona rendimenti, esegue callback
  5. sottrarre T1 da ora corrente
  6. se il risultato 0
  7. se il risultato> = la richiesta di intervallo, valore di ritardo impostato desiderato = 0
  8. setTimeout chiamata con il valore di ritardo, dando inizio al ciclo successivo

Quello che posso dirvi è, utilizzare una bandiera nel codice. Come (non quello che in realtà raccomando solo un semplice esempio)

var isWorking = false;
function doRequest(){
  if(isWorking) return;
  isWorking = true;
  $.ajax({
    ...,
    success: workWithResponse
  });
}

function workWithResponse(){
  /* doAnythingelse */
  isWorking = false;
}

setInterval(doRequest,1000);

Una cosa del genere, la sua primitiva ma si eviterà condizioni di gara. Saluti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top