Ajax sendete auf "keyup" Duplikate Ergebnisse beim schnellen Tippen!

8

Das ist mein Ajax:

%Vor%

Wenn ich langsam tippe (langsamer als ein Buchstabe pro Sekunde), bekomme ich die Ergebnisse korrekt, wenn ich schneller tippe, bekomme ich zweimal die gleichen Ergebnisse

Beispiel:
langsame Eingabe: res1 res2 res3
schnelle Eingabe: res1 res2 res3 res1 res2 res3

Außerdem wäre jeder Hinweis zur Verbesserung des Codes willkommen!

    
ilyo 13.07.2011, 11:57
quelle

2 Antworten

7

Das ist was passiert (Pseudocode):

Wenn Sie langsam tippen:

%Vor%

Wenn Sie schnell tippen:

%Vor%

Um das Duplikatproblem zu lösen möchten Sie, dass Ihre Ergebnisse eine atomare Operation entfernen / anhängen - mit .replaceWith .

Erstellen Sie die Ergebnisse zuerst als String und dann als .replaceWith anstelle von .remove / .append :

%Vor%

Ein anderes Problem (das nicht mit Duplikaten zusammenhängt) kann sein, dass ältere Ergebnisse neuere Werte überschreiben, die früher eingetroffen sind (), weil AJAX asynchron ist und der Server möglicherweise Antworten in derselben Reihenfolge gibt, in der Anfragen eingehen).

Ein Ansatz, um dies zu vermeiden, ist die Anfügung eines Roundtrip-Markers (Art der "Seriennummer") an jede Anfrage und deren Überprüfung als Antwort:

%Vor%

Auf der Serverseite:

%Vor%

Ein anderer Ansatz wäre es, .ajax() -Anfragen synchron zu machen und async auf false zu setzen. Dies kann jedoch vorübergehend den Browser sperren, während die Anfrage aktiv ist (siehe Dokumente )

Außerdem sollten Sie auf jeden Fall eine Zeitüberschreitung einführen, wie algiecas vorschlägt, um die Serverlast zu reduzieren ( drittes Problem, nicht verwandt mit Duplikaten oder Anfrage / Antwort-Reihenfolge ).

    
lxa 13.07.2011, 12:25
quelle
1

Vor dem Aufruf von ajax solltest du ein Timeout einplanen. So etwas sollte funktionieren:

%Vor%

Ich hoffe, das hilft.

    
algiecas 13.07.2011 12:17
quelle

Tags und Links