2010-05-04 16 views
6

Ich habe eine Cross-Domain-Lang-Abfrage-Anfrage mit einem Rückruf mit getJSON, die etwa wie folgt aussieht:Wie töte ich eine ältere JSONP-Anfrage?

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

Das Problem ist die Anforderung an den Lang Polling Service könnte eine Weile dauern, zurückzukehren, und eine andere getJSON In der Zwischenzeit kann eine Anfrage gestellt werden, die die Seite aktualisiert, obwohl es sich um eine veraltete Antwort handelt.

Req1: h ** p: //long-polling.com/some.fcgi bei 10.00

Req2: h ** p: //long-polling.com /some.fcgi? bei 10.01

Req1 kehrt und aktualisiert die Daten auf der Seite 10.02

möchte ich einen Weg, um die Rückkehr von Req1 ungültig zu machen, wenn Req2 bereits gemacht worden.

Danke!

Antwort

5

Wenn Sie die Ajax-Anforderung ausführen, wird das XMLHttpRequest-Objekt zurückgegeben. Wenn Sie den Anruf abort möchten, können Sie die .abort() Methode darauf aufrufen.

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

+1. War im Begriff, genau die gleiche Antwort zu geben. – Boldewyn

+7

JSONP verwendet XMLHttpRequest nicht, es fügt ein HTML

7

Ich glaube nicht, dass als getJSON arbeitet verwendet JSONP Methode, die tatsächlich funktioniert durch dynamisch ein Skript-Tag, die Ihr Browser ausführt, eingefügt wird. Ich glaube nicht, dass es eine Möglichkeit gibt, den Browser daran zu hindern, das Skript auszuführen ... gibt es das?

+0

Einverstanden; Weitere Informationen finden Sie unter http://stackoverflow.com/questions/4162261/i-cannot-stop-an-ajax-request-using-jquery-and-abort-function – goggin13

1

Wie @NewToDB erwähnt, können Sie die JSONP-Anfrage nicht abbrechen (z. B. dem Browser mitteilen, dass sie nicht mehr versuchen soll, den SRC eines Tags zu laden), aber Sie könnten einen Mechanismus implementieren, der die zurückgegebenen Daten des alten Aufrufs ignoriert. Definieren Sie eine globale Variable, die bei jedem Aufruf des jsonp-Aufrufs inkrementiert wird, und übergeben Sie den Wert dieser Variablen als Parameter an den Server. Sie müssen auch den Zähler vom Server zurückgeben (ich nehme an, Sie besitzen auch den Server-Code). Wenn der aktuelle Wert Ihres Leistungsindikators nicht mit dem zurückgegebenen Leistungsindikatorwert übereinstimmt, wissen Sie, dass bereits ein anderer Serveraufruf erfolgt ist, sodass Sie die zurückgegebenen Daten ignorieren können.

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

verwende ich globale Variable für eine solche Aufgabe. Das ist kein ziemlich guter Weg, aber der einfachste.

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