Warum funktioniert ein einzelner Ajax-Anruf, aber aufeinanderfolgende Ajax-Anrufe schlagen fehl?

8

Einrichtung:

Ich habe eine Datentabelle, deren jede Zeile anklickbar ist. Wenn auf eine Zeile geklickt wird, wird ein Ajax-Aufruf durchgeführt, der einige Daten zurückgibt. Manchmal benötigt der Ajax-Aufruf etwas Zeit, abhängig von der Menge der zurückgesendeten Daten. Es funktioniert alles gut.

Problem:

Das Problem tritt auf, wenn die Zeilen nacheinander schnell angeklickt werden. Kurz gesagt, bevor der vorherige Ajax-Aufruf zurückkehrt, wenn die Zeile angeklickt wird (d. H. Ein neuer Ajax-Aufruf wird gemacht), erhalte ich einen Fehler.

%Vor%

(Der Ajax-Aufruf gibt eine JSONP-Daten zurück)

Es sieht so aus, als würden sich die Ajax-Anrufe irgendwie vermischen (?), aber ich bin mir nicht sicher. Kann mir bitte jemand sagen, warum passiert das?

Bitte lassen Sie mich wissen, wenn weitere Informationen erforderlich sind, um das Problem zu klären.

Danke

EDIT 1:

Hier ist ein Ajax-Code:

%Vor%

EDIT 2:

Hier ist die Klasse, die callback ihren Namen zuweist. Wenn der Standardrückrufwert null ist, weist er einen Standardwert "Rückruf" zu. Sieht aber so aus, als ob der Standard-Callback immer Null ist und daher immer "Callback" zuweist.

%Vor%

Und die obige Klasse wird wie folgt in mvc-servlet.xml referenziert:

%Vor%     
Bhushan 16.07.2012, 07:15
quelle

2 Antworten

7

Das Problem besteht darin, wie jQuery mit dem Rückruf mit JSONP arbeitet. Hier ist die Idee:

  1. JSONP wird ausgelöst;
  2. Rückruf ist eingestellt;
  3. JSONP gibt zurück;
  4. Der Rückruf wird ausgelöst;
  5. Rückruf wird gelöscht;

Nun funktioniert alles einwandfrei, wenn Sie nicht die benutzerdefinierte jsonpCallback definieren (jQuery weist standardmäßig jeder JSONP-Anfrage einen eindeutigen Rückruf zu). Was passiert nun, wenn Sie das tun und gleichzeitig zwei JSONP-Anfragen auslösen?

  1. JSONP1 wird ausgelöst;
  2. Der Rückruf mit dem Namen callback ist festgelegt.
  3. JSONP2 wird ausgelöst;
  4. Der Rückruf callback wird von JSONP2;
  5. überschrieben
  6. JSONP1 gibt zurück;
  7. Der Rückruf callback wird für JSONP1 ausgelöst;
  8. JSONP1 löscht callback ;
  9. JSONP2 gibt zurück;
  10. JSONP2 versucht, callback auszulösen, aber das ist bereits gelöscht;
  11. TypeError wird ausgelöst.

Einfache Lösung besteht nicht darin, jsonpCallback Option zu überschreiben.

    
freakish 16.07.2012, 07:38
quelle
4

Wie Alex Ball vorgeschlagen hat, müssen Sie Ihre AJAX-Anfragen in die Warteschlange stellen, so dass sie nacheinander ausgeführt werden. Es ist sehr einfach, wie hier hier in einem Beitrag in stackoverflow (ja, es funktioniert auch für JSON-P).

>

Die zweite Sache ist die Fehlermeldung Property 'callback' of object [object Window] is not a function , nur weil Sie keine globale Funktion namens callback haben. Definieren Sie es einfach wie folgt:

%Vor%

Hoffe, das hilft.

    
tusar 16.07.2012 07:34
quelle

Tags und Links