Ich habe eine AJAX-Anfrage, die alle 5 Sekunden gestellt wird. Das Problem liegt jedoch vor der AJAX-Anforderung, wenn die vorherige Anforderung nicht abgeschlossen ist. Ich muss diese Anforderung abbrechen und eine neue Anforderung stellen.
Mein Code ist ungefähr so. Wie kann ich dieses Problem beheben?
$(document).ready(
var fn = function(){
$.ajax({
url: 'ajax/progress.ftl',
success: function(data) {
//do something
}
});
};
var interval = setInterval(fn, 500);
);
Antworten:
Die jquery ajax-Methode gibt ein XMLHttpRequest- Objekt zurück. Mit diesem Objekt können Sie die Anforderung abbrechen.
Die XMLHttpRequest verfügt über eine Abbruchmethode , die die Anforderung abbricht. Wenn die Anforderung jedoch bereits an den Server gesendet wurde, verarbeitet der Server die Anforderung auch dann, wenn die Anforderung abgebrochen wird, der Client jedoch nicht auf die Antwort wartet / diese verarbeitet.
Das xhr-Objekt enthält auch einen readyState, der den Status der Anforderung enthält (UNSENT-0, OPENED-1, HEADERS_RECEIVED-2, LOADING-3 und DONE-4). Damit können wir überprüfen, ob die vorherige Anfrage abgeschlossen wurde.
quelle
readystate
oben undreadyState
unten, der Charakters
wird in jQuery 1.5if (xhr) xhr.abort();
wird auch gut funktionieren.readystate
in seiner Dokumentation nie verwendet und nicht groß geschrieben . Es wurde immer groß geschriebenreadyState
und die Abfrage (vor oder nach 1.5) entspricht korrekt der w3-Spezifikation.Ich weiß, dass dies etwas spät sein könnte, aber ich habe ähnliche Probleme, bei denen das Aufrufen der Abbruchmethode die Anforderung nicht wirklich abgebrochen hat. Stattdessen wartete der Browser immer noch auf eine Antwort, die er nie verwendet. Dieser Code hat dieses Problem behoben.
quelle
Wenn Sie eine Anfrage an einen Server stellen, lassen Sie ihn zuerst überprüfen, ob ein Fortschritt nicht null ist (oder diese Daten abruft). Wenn Daten abgerufen werden, brechen Sie die vorherige Anforderung ab und initiieren Sie die neue.
quelle
Warum sollten Sie die Anfrage abbrechen?
Was passiert, wenn jede Anfrage länger als fünf Sekunden dauert?
Sie sollten die Anforderung nicht abbrechen, wenn sich der mit der Anforderung übergebene Parameter nicht ändert. Beispiel: - Die Anforderung dient zum Abrufen der Benachrichtigungsdaten. In solchen Situationen besteht der nette Ansatz darin, eine neue Anforderung erst nach Abschluss der vorherigen Ajax-Anforderung festzulegen.
quelle
Sie können jquery-validate.js verwenden. Das Folgende ist das Code-Snippet aus jquery-validate.js.
Damit Sie einfach nur den Parameter einstellen müssen Modus abbrechen , wenn Sie Ajax - Anfrage machen.
Ref: https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.14.0/jquery.validate.js
quelle
jQuery: Verwenden Sie dies als Ausgangspunkt - als Inspiration. Ich habe es so gelöst: (Dies ist keine perfekte Lösung, es bricht nur die letzte Instanz ab und ist WIP-Code)
quelle
Erstellen Sie eine Funktion zum Aufrufen Ihrer API. Innerhalb dieser Funktion definieren wir die Anforderung
callApiRequest = $.get(...
- obwohl dies eine Definition einer Variablen ist, wird die Anforderung sofort aufgerufen, aber jetzt haben wir die Anforderung als Variable definiert. Bevor die Anforderung aufgerufen wird, prüfen wir, ob unsere Variable definiert isttypeof(callApiRequest) != 'undefined'
und ob sie aussteht.suggestCategoryRequest.state() == 'pending'
Wenn beide wahr sind, wird.abort()
die Anforderung, die den erfolgreichen Rückruf verhindert, ausgeführt.Ihr Server / Ihre API unterstützt möglicherweise nicht das Abbrechen der Anforderung (was ist, wenn die API bereits Code ausgeführt hat?), Der Javascript-Rückruf wird jedoch nicht ausgelöst. Dies ist nützlich, wenn Sie beispielsweise einem Benutzer Eingabevorschläge bereitstellen, z. B. die Eingabe von Hashtags.
Sie können diese Funktion weiter erweitern, indem Sie die Definition des Fehlerrückrufs hinzufügen. Was soll passieren, wenn die Anforderung abgebrochen wurde?
Ein häufiger Anwendungsfall für dieses Snippet ist eine Texteingabe, die bei einem
keypress
Ereignis ausgelöst wird. Sie können eine Zeitüberschreitung verwenden, um das Senden (einiger) Anforderungen zu verhindern, die Sie abbrechen müssen.abort()
.quelle
Sie sollten auch nach readyState 0 suchen. Wenn Sie xhr.abort () verwenden, setzt diese Funktion readyState in diesem Objekt auf 0, und Ihre if-Prüfung ist immer wahr - readyState! = 4
quelle