Ist es möglich, dass mit jQuery, ich eine Ajax-Anfrage abbrechen/verhindern von dem ich noch keine Antwort erhalten habe?
Antworten
Zu viele Anzeigen?Die meisten jQuery-Ajax-Methoden geben ein XMLHttpRequest-Objekt (oder ein entsprechendes Objekt) zurück, so dass Sie einfach Folgendes verwenden können abort()
.
Siehe die Dokumentation:
- Abbrechen Methode ( エムエスディーエヌ ). Bricht die aktuelle HTTP-Anfrage ab.
-
Abbrechen() ( MDN ). Wenn die Anfrage bereits abgeschickt wurde, bricht diese Methode die Anfrage ab.
var xhr = $.ajax({ type: "POST", url: "some.php", data: "name=John&location=Boston", success: function(msg){ alert( "Data Saved: " + msg ); } });
//kill the request xhr.abort()
UPDATE: Ab jQuery 1.5 ist das zurückgegebene Objekt ein Wrapper für das native XMLHttpRequest-Objekt namens jqXHR. Dieses Objekt scheint alle nativen Eigenschaften und Methoden zur Verfügung zu stellen, sodass das obige Beispiel weiterhin funktioniert. Siehe Das jqXHR-Objekt (jQuery-API-Dokumentation).
UPDATE 2: Ab jQuery 3 gibt die ajax-Methode nun ein Versprechen mit zusätzlichen Methoden (wie abort) zurück, so dass der obige Code immer noch funktioniert, obwohl das zurückgegebene Objekt kein xhr
noch mehr. Siehe die 3.0-Blog hier .
UPDATE 3 : xhr.abort()
funktioniert immer noch mit jQuery 3.x. Gehen Sie nicht davon aus, dass die Update 2 ist richtig. Weitere Informationen zum jQuery-Github-Repository .
Sie können die Anfrage nicht zurückrufen, aber Sie können einen Timeout-Wert festlegen, nach dem die Antwort ignoriert wird. Siehe dies Seite für Jquery-AJAX-Optionen. Ich glaube, dass Ihr Fehler-Callback aufgerufen wird, wenn die Timeout-Zeit überschritten wird. Es gibt bereits eine Standard-Zeitüberschreitung für jede AJAX-Anfrage.
Sie können auch die Abbrechen() Methode für das Request-Objekt, aber der Client hört zwar auf, auf das Ereignis zu warten, aber es Mai wird den Server wahrscheinlich nicht davon abhalten, sie zu verarbeiten.
Speichern Sie die getätigten Aufrufe in einem Array und rufen Sie dann xhr.abort()
auf jeden.
RIESIGER CAVEAT : Sie können eine Anfrage abbrechen, aber das gilt nur für die Client-Seite. Die Serverseite könnte die Anfrage noch bearbeiten. Wenn Sie etwas wie PHP oder ASP mit Sitzungsdaten verwenden, sind die Sitzungsdaten gesperrt, bis die Ajax-Anfrage abgeschlossen ist. Damit der Benutzer also weiter auf der Website surfen kann, müssen Sie session_write_close()
. Dadurch wird die Sitzung gespeichert und die Sperre aufgehoben, so dass andere Seiten, die auf eine Fortsetzung warten, fortfahren können. Andernfalls können mehrere Seiten darauf warten, dass die Sperre aufgehoben wird.
Es ist ein asynchronous
Anfrage, d.h. sobald sie abgeschickt wurde, ist sie draußen.
Falls Ihr Server einen sehr teuren Betrieb aufgrund der AJAX
Anfrage, können Sie Ihren Server bestenfalls so öffnen, dass er auf Abbruchanfragen wartet, und eine separate AJAX
Anfrage, die dem Server mitteilt, dass er aufhören soll, was auch immer er gerade tut.
Andernfalls ignorieren Sie einfach die AJAX
Antwort.
AJAX-Anfragen werden möglicherweise nicht in der Reihenfolge abgeschlossen, in der sie gestartet wurden. Anstatt abzubrechen, können Sie wählen ignorieren. alle AJAX-Antworten außer der letzten:
- Einen Zähler erstellen
- Erhöhen Sie den Zähler, wenn Sie eine AJAX-Anfrage starten
- Verwenden Sie den aktuellen Wert des Zählers, um die Anfrage zu "stempeln".
- Im Erfolgs-Callback wird der Stempel mit dem Zähler verglichen, um zu prüfen, ob es sich um die letzte Anfrage handelt
Grobe Skizze des Codes:
var xhrCount = 0;
function sendXHR() {
// sequence number for the current invocation of function
var seqNumber = ++xhrCount;
$.post("/echo/json/", { delay: Math.floor(Math.random() * 5) }, function() {
// this works because of the way closures work
if (seqNumber === xhrCount) {
console.log("Process the response");
} else {
console.log("Ignore the response");
}
});
}
sendXHR();
sendXHR();
sendXHR();
// AJAX requests complete in any order but only the last
// one will trigger "Process the response" message
- See previous answers
- Weitere Antworten anzeigen