2010-05-04 36 views
6

Tengo una petición entre dominios sondeo largo usando getJSON con una devolución de llamada que se ve algo como esto:cómo matar una solicitud jsonp anterior?

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

El problema es la solicitud al servicio de votación larga podría tomar un tiempo para volver, y otro getJSON la solicitud se puede hacer mientras tanto y actualizar la página a pesar de que es una respuesta obsoleta.

REQ1: h ** p: //long-polling.com/some.fcgi en 10 a.m.

REQ2: h ** p: //long-polling.com /some.fcgi? en 10:01

vuelve REQ1 y actualiza los datos en la página 10:02

quiero una manera de invalidar el regreso de REQ1 si REQ2 ya se ha hecho.

Gracias!

Respuesta

5

Al hacer la petición ajax devuelve el objeto XMLHttpRequest. Si desea llamar al abort, puede llamar al método .abort().

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

+1. Estaba a punto de dar la misma respuesta. – Boldewyn

+7

JSONP no utiliza XMLHttpRequest, se inyecta una

7

no creo que funciona como el método utiliza getJSON JSONP que en realidad funciona mediante la inserción dinámica de una etiqueta de script que ejecuta el navegador. No creo que haya ninguna forma de evitar que el navegador ejecute el script ... ¿está ahí?

+0

De acuerdo; vea esta pregunta para más detalles, http://stackoverflow.com/questions/4162261/i-cannot-stop-an-ajax-request-using-jquery-and-abort-function – goggin13

1

Como se menciona @NewToDB, no puede cancelar la solicitud jsonp (por ejemplo, decirle al navegador que deje de intentar cargar el src de una etiqueta), pero podría implementar un mecanismo que efectivamente ignore los datos devueltos de la llamada anterior. Defina una variable global que se incrementa cada vez que va a hacer la llamada jsonp y pasar el valor de esa variable al servidor como parámetro. También necesita pasar el contador del servidor (supongo que también es el propietario del código del servidor). Si el valor actual de su contador no es igual al valor del contador devuelto, entonces sabrá que ya se ha realizado otra llamada al servidor, por lo que puede ignorar los datos devueltos.

// 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

utilizo variable global para tal tarea. Esta no es una buena manera, sino la más simple.

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