2010-05-04 18 views
6

ho una richiesta tra domini polling lungo usando getJSON con un callback che sembra qualcosa di simile:come uccidere una richiesta jsonp precedente?

$.getJSON("http://long-polling.com/some.fcgi?jsoncallback=?" 
    function(data){ 
      if(data.items[0].rval == 1) { 
      // update data in page 
      } 
    }); 

Il problema è la richiesta al servizio a lungo polling potrebbe richiedere un po 'per tornare, e un altro getJSON potrebbe essere richiesta nel frattempo e aggiornare la pagina anche se è una risposta obsoleta.

Req1: h ** p: //long-polling.com/some.fcgi a 10:00

Req2: h ** p: //long-polling.com /some.fcgi? a 10:01

rendimenti Req1 e aggiorna i dati sulla pagina 10:02

Voglio un modo per invalidare il ritorno da Req1 se Req2 è già stata fatta.

Grazie!

risposta

5

Quando si effettua la richiesta ajax, restituisce l'oggetto XMLHttpRequest. Se si desidera chiamare la chiamata abort, è possibile chiamare il metodo .abort().

var request = $.getJSON(. . . . .); 
request.abort(); 
+0

+1. Stava per dare la stessa risposta. – Boldewyn

+7

JSONP non utilizza XMLHttpRequest, inietta un tag HTML

7

Non credo che funziona come il getJSON utilizza il metodo JSONP che in realtà funziona inserendo dinamicamente un tag script che esegue il browser. Non penso che ci sia un modo per impedire al browser di eseguire lo script ... c'è?

+0

concordato; vedi questa domanda per maggiori dettagli, http://stackoverflow.com/questions/4162261/i-cannot-stop-an-ajax-request-using-jquery-and-abort-function – goggin13

1

Come @NewToDB menzionato, non è possibile annullare la richiesta jsonp (ad esempio dire al browser di interrompere il tentativo di caricare l'src di un tag), ma è possibile implementare un meccanismo che ignori efficacemente i dati restituiti della chiamata precedente. Definire una variabile globale che viene incrementata ogni volta che si esegue la chiamata jsonp e si passa il valore di tale variabile al server come parametro. È inoltre necessario passare il contatore dal server (presumo che possieda anche il codice del server). Se il valore corrente del contatore non è uguale al valore del contatore restituito, si sa che è già stata effettuata un'altra chiamata al server, quindi è possibile ignorare i dati restituiti.

// Global counter 
var callCounter = 0; 

...

$.getJSON("http://long-polling.com/some.fcgi?callCounter=" + (++callCounter) + "&jsoncallback=?" 
    function(data){ 
      if(data.items[0].rval == 1 && data.callCounter == callCounter) { 
      // update data in page 
      } 
    }); 
0

io uso variabile globale per tale compito. Questo non è un buon modo, ma il più semplice.

if (typeof(myFooRequest) == 'object') { 
    myFooRequest.abort(); 
    myFooRequest = false; 
} 
myFooRequest = $.get("/url", function(data) { 
    // ... 
});