Wie kann ich mit jQuery eine Ajax-Anfrage abbrechen / abbrechen , von der ich die Antwort noch nicht erhalten habe?
javascript
jquery
ajax
lauwm
quelle
quelle
$.ajaxStop
?ajaxStop
, erkennt nur, wenn alle AJAX-Anfragen abgeschlossen sind, es stoppt keine Anfrage. Nach meiner Erfahrung würden Sie es so verwenden :$(document).ajaxStop(function(){alert("All done")})
. Verwenden.abort()
ist die beste Option.Antworten:
Die meisten jQuery Ajax-Methoden geben ein XMLHttpRequest-Objekt (oder ein gleichwertiges Objekt) zurück, sodass Sie es einfach verwenden können
abort()
.Siehe die Dokumentation:
UPDATE: Ab jQuery 1.5 ist das zurückgegebene Objekt ein Wrapper für das native XMLHttpRequest-Objekt mit dem Namen jqXHR. Dieses Objekt scheint alle nativen Eigenschaften und Methoden verfügbar zu machen, sodass das obige Beispiel weiterhin funktioniert. Siehe Das jqXHR-Objekt (jQuery-API-Dokumentation).
UPDATE 2: Ab jQuery 3 gibt die Ajax-Methode jetzt ein Versprechen mit zusätzlichen Methoden (wie Abbruch) zurück, sodass der obige Code weiterhin funktioniert, obwohl das zurückgegebene Objekt kein Objekt
xhr
mehr ist. Siehe den 3.0-Blog hier .UPDATE 3 :
xhr.abort()
funktioniert immer noch mit jQuery 3.x. Gehen Sie nicht davon aus, dass das Update 2 korrekt ist. Weitere Informationen zum jQuery Github-Repository .quelle
abort
keine bestehende Verbindung zum Server,success
wird also weiterhin aufgerufen. Dies ist sehr problematisch für Implementierungen von Comet mit langen Abfragen..abort()
funktioniert immer noch für mich in jQuery 3.2.1. Dieser Kommentar in einem verwandten Github-Problem eines jQuery-Kernteammitglieds scheint zu implizieren, dass diese Antwort falsch ist und.abort()
nicht entfernt wurde.Sie können die Anforderung nicht zurückrufen, aber Sie können einen Zeitüberschreitungswert festlegen, nach dem die Antwort ignoriert wird. Auf dieser Seite finden Sie die AJAX-Optionen für jquery. Ich glaube, dass Ihr Fehlerrückruf aufgerufen wird, wenn die Zeitüberschreitung überschritten wird. Bei jeder AJAX-Anforderung gibt es bereits ein Standardzeitlimit.
Sie können auch die abort () -Methode für das Anforderungsobjekt verwenden. Der Client hört zwar nicht mehr auf das Ereignis, verhindert jedoch
möglicherweisenicht, dass der Server es verarbeitet.quelle
Es ist eine asynchrone Anfrage, dh sobald sie gesendet wurde, ist sie da draußen.
Wenn Ihr Server aufgrund der AJAX-Anforderung einen sehr teuren Vorgang startet, können Sie Ihren Server am besten öffnen, um auf Abbruchanforderungen zu warten, und eine separate AJAX-Anforderung senden, in der der Server benachrichtigt wird, dass er seine Aktivitäten beenden soll.
Andernfalls ignorieren Sie einfach die AJAX-Antwort.
quelle
Speichern Sie die von Ihnen getätigten Aufrufe in einem Array und rufen Sie dann jeweils xhr.abort () auf.
RIESIGE CAVEAT: Sie können eine Anfrage abbrechen, aber das ist nur die Client-Seite. Die Serverseite könnte die Anforderung weiterhin verarbeiten. Wenn Sie PHP oder ASP mit Sitzungsdaten verwenden, werden die Sitzungsdaten gesperrt, bis der Ajax beendet ist. Damit der Benutzer weiterhin auf der Website surfen kann, müssen Sie session_write_close () aufrufen . Dadurch wird die Sitzung gespeichert und entsperrt, sodass andere Seiten, die auf die Fortsetzung warten, fortgesetzt werden. Ohne dies können mehrere Seiten darauf warten, dass die Sperre entfernt wird.
quelle
AJAX-Anforderungen werden möglicherweise nicht in der Reihenfolge ausgeführt, in der sie gestartet wurden. Anstatt abzubrechen, können Sie alle AJAX-Antworten außer der neuesten ignorieren :
Grobe Darstellung des Codes:
Demo auf jsFiddle
quelle
Wir mussten dieses Problem nur umgehen und drei verschiedene Ansätze testen.
In unserem Fall haben wir uns für Ansatz 3 entschieden, da der Server weniger belastet wird. Ich bin mir jedoch nicht 100% sicher, ob jQuery den Aufruf der .complete () - Methode garantiert. Dies könnte zu einer Deadlock-Situation führen. In unseren Tests konnten wir eine solche Situation nicht reproduzieren.
quelle
Es ist immer die beste Vorgehensweise, so etwas zu tun.
Es ist jedoch viel besser, wenn Sie eine if-Anweisung überprüfen, um zu überprüfen, ob die Ajax-Anforderung null ist oder nicht.
quelle
Rufen Sie einfach xhr an. abort () ob es sich um ein jquery ajax-Objekt oder ein natives XMLHTTPRequest-Objekt handelt.
Beispiel:
quelle
Ich habe eine Live-Suchlösung durchgeführt und musste ausstehende Anfragen abbrechen, die möglicherweise länger gedauert haben als die letzte / aktuellste Anfrage.
In meinem Fall habe ich so etwas verwendet:
quelle
Wie viele Personen im Thread festgestellt haben, verarbeitet der Server die Anforderung weiterhin, nur weil die Anforderung auf der Clientseite abgebrochen wird. Dies führt zu einer unnötigen Belastung des Servers, da die Arbeit erledigt wird, die wir im Front-End nicht mehr hören.
Das Problem, das ich zu lösen versuchte (auf das möglicherweise auch andere stoßen), besteht darin, dass ich, als der Benutzer Informationen in ein Eingabefeld eingab, eine Anfrage nach einem Google Instant-Gefühl auslösen wollte.
Um unnötige Anfragen zu vermeiden und die Schnelligkeit des Frontends aufrechtzuerhalten, habe ich Folgendes getan:
Dadurch wird im Wesentlichen alle 150 ms eine Anfrage gesendet (eine Variable, die Sie an Ihre eigenen Bedürfnisse anpassen können). Wenn Sie Probleme haben, zu verstehen , was genau hier passiert, meldet
xhrCount
undxhrQueue
an die Konsole kurz vor dem if - Block.quelle
Verwenden Sie einfach ajax.abort (), um beispielsweise eine ausstehende Ajax-Anfrage abzubrechen, bevor Sie eine solche senden
quelle
Sie können damit jeden kontinuierlichen Ajax-Anruf abbrechen
quelle
Es gibt keinen zuverlässigen Weg, dies zu tun, und ich würde es nicht einmal versuchen, sobald die Anfrage unterwegs ist. Die einzige Möglichkeit, vernünftig zu reagieren, besteht darin , die Antwort zu ignorieren .
In den meisten Fällen kann dies in folgenden Situationen vorkommen: Ein Benutzer klickt zu oft auf eine Schaltfläche, die viele aufeinanderfolgende XHR auslöst. Hier haben Sie viele Optionen. Blockieren Sie entweder die Schaltfläche, bis XHR zurückgegeben wird, oder lösen Sie nicht einmal eine neue XHR aus, während ein anderer Hinweis ausführt Der Benutzer muss sich zurücklehnen - oder alle ausstehenden XHR-Antworten außer den letzten verwerfen.
quelle
Der folgende Code zeigt das Initiieren und Abbrechen einer Ajax-Anforderung:
quelle
Ich hatte das Problem des Abrufs und sobald die Seite geschlossen wurde, wurde die Abfrage fortgesetzt, sodass ein Benutzer in meinem Fall ein Update verpassen würde, da ein MySQL-Wert für die nächsten 50 Sekunden nach dem Schließen der Seite festgelegt wurde, obwohl ich die Ajax-Anforderung beendet habe Wenn Sie $ _SESSION verwenden, um eine Variable festzulegen, wird sie in der Umfrage nicht selbst aktualisiert, bis sie beendet ist und eine neue gestartet wurde. Ich habe also in meiner Datenbank einen Wert als 0 = offpage festgelegt, während ich bin Abfrage Ich frage diese Zeile ab und gebe false zurück. Wenn es 0 ist, erhalten Sie beim Abfragen beim Abrufen offensichtlich aktuelle Werte ...
Ich hoffe das hat geholfen
quelle
Wenn
xhr.abort();
das Neuladen der Seite verursacht wird,Dann können Sie
onreadystatechange
vor dem Abbruch einstellen , um Folgendes zu verhindern:quelle
Ich habe eine Demo freigegeben , die zeigt, wie eine AJAX-Anforderung abgebrochen wird, wenn Daten nicht innerhalb einer vordefinierten Wartezeit vom Server zurückgegeben werden.
HTML:
JS CODE:
quelle
$.ajax
bietet einetimeout
Option, sodass Sie keine eigenen schreiben müssen. Einfach benutzen..., data: {...}, timeout: waitTime,...
.