Ich habe eine Javascript-Anwendung erstellt, die ein Diagramm mit einigen Dropdown-Filter, die Benutzer ändern können, hat. Die Dropdownlisten verfügen alle über Ereignis-Listener, die eine Serveranforderung senden, um die Daten zu erhalten (über einen JQuery-Ajax-Aufruf) und anschließend die Daten grafisch darstellen. Das Problem ist, wenn der Benutzer die Tastatur verwendet, um schnell durch viele verschiedene Elemente des Dropdown-Menüs zu gehen.Töte Ajax-Anrufe, wenn eine neue ausgelöst wird
Der Serveraufruf dauert ungefähr eine Sekunde, wenn sie also schnell durch 20 scrollen, kann dies zu einer Anhäufung führen. Es werden 20 verschiedene Anforderungen an den Server erstellt, und dann gibt es nicht einmal eine Garantie, dass der letzte Code, der bei Serveranforderung ausgeführt wird, der aktuellste Filter ist.
Also meine Frage ist, was ist der beste Weg, wenn ein Filter geändert wird, um alle anderen asynchronen Prozesse zu beenden? Hier ist der relevante Code:
$("#filter").change(function(d) {
getData();
} //end of if
});
function getData() {
...
$.ajax({
url: myUrl
type: "GET",
dataType: "json",
success: function(d) {
[do some stuff]
} //end of success function
}); //end of ajax
} //end of getData
Sie haben eine zusätzliche geschweifte Klammer in dieser ersten Funktion sagt es schließt ein 'if'. – AtheistP3ace
Sie sollten warten, bis die aktuell ausgeführte Anfrage beendet ist, bevor Sie eine neue Anfrage senden (und einige Anfragen auslassen, die während der Ausführung der aktuellen Anfrage auftreten könnten). Selbst wenn Sie die 'Abbruch'-Funktionalität von' XMLHttpRequest2' verwenden würden, könnte dies immer noch zu einer unnötig hohen Serverlast führen. –
Mögliches Duplikat von [Früheren AJAX-Aufruf abbrechen, wenn ein neuer erstellt wird?] (Https://stackoverflow.com/questions/9285271/abort-previous-ajax-call-when-a-new-one-made) –