2003 Stimmen

Abbruch von Ajax-Anfragen mit jQuery

Ist es möglich, dass mit jQuery, ich eine Ajax-Anfrage abbrechen/verhindern von dem ich noch keine Antwort erhalten habe?

1864voto

meouw Punkte 40856

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 .

123voto

tvanfosson Punkte 506878

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.

82voto

Tei Punkte 1400

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.

77voto

Yuval Adam Punkte 155168

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.

70voto

Salman A Punkte 246207

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

Demo auf jsFiddle

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X