javascript - stop - Bricht Ajax-Anfragen mit jQuery ab




jquery prevent ajax (12)

AJAX-Anforderungen werden möglicherweise nicht in der Reihenfolge ausgeführt, in der sie gestartet wurden. Anstatt abzubrechen, können Sie alle AJAX-Antworten mit Ausnahme der letzten ignorieren :

  • Erstellen Sie einen Zähler
  • Erhöhen Sie den Zähler, wenn Sie eine AJAX-Anfrage einleiten
  • Verwenden Sie den aktuellen Wert des Zählers, um die Anfrage zu "stempeln"
  • Vergleichen Sie im Erfolgsrückruf den Stempel mit dem Zähler, um zu prüfen, ob es sich um die letzte Anfrage handelt

Grober Umriss 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

https://code.i-harness.com

Wie kann ich mit jQuery eine Ajax-Anfrage abbrechen / abbrechen , von der ich noch keine Antwort erhalten habe?


Der folgende Code zeigt das Initiieren sowie das Abbrechen einer Ajax-Anfrage:

function libAjax(){
  var req;
  function start(){

  req =    $.ajax({
              url: '1.php',
              success: function(data){
                console.log(data)
              }
            });

  }

  function stop(){
    req.abort();
  }

  return {start:start,stop:stop}
}

var obj = libAjax();

 $(".go").click(function(){


  obj.start();


 })



 $(".stop").click(function(){

  obj.stop();


 })
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="button" class="go" value="GO!" >
   <input type="button" class="stop" value="STOP!" >

Es ist eine asynchrone Anfrage, was bedeutet, sobald es gesendet wird, ist es da draußen.

Falls Ihr Server aufgrund der AJAX-Anfrage einen sehr teuren Vorgang startet, sollten Sie Ihren Server so öffnen, dass er auf Löschanforderungen wartet, und eine separate AJAX-Anfrage senden, die den Server benachrichtigt, damit er stoppt, was auch immer er tut.

Andernfalls ignorieren Sie einfach die AJAX-Antwort.


Es ist immer die beste Vorgehensweise, so etwas zu tun.

var $request;
if ($request != null){ 
    $request.abort();
    $request = null;
}

$request = $.ajax({
    type : "POST", //TODO: Must be changed to POST
    url : "yourfile.php",
    data : "data"
    }).done(function(msg) {
        alert(msg);
    });

Aber es ist viel besser, wenn Sie eine if-Anweisung überprüfen, um zu überprüfen, ob die Ajax-Anfrage null ist oder nicht.


Ich hatte das Problem des Pollings und sobald die Seite geschlossen wurde, ging die Umfrage weiter. In meinem Fall würde ein Benutzer ein Update verpassen, da ein Mysql-Wert für die nächsten 50 Sekunden nach Schließen der Seite gesetzt wurde, obwohl ich die Ajax-Anfrage, I, beendete Um es herum zu finden, benutze $ _SESSION, um eine Variable zu setzen, wird nicht in der Abfrage selbst aktualisiert, bis sie beendet ist und eine neue begonnen hat. Also habe ich einen Wert in meiner Datenbank als 0 = offpage gesetzt, während ich bin polling Ich frage diese Zeile ab und gebe false zurück; Wenn es 0 ist, wenn Sie in der Abfrage abfragen, erhalten Sie offensichtlich aktuelle Werte ...

Ich hoffe, das hat geholfen


Ich machte eine Live Search-Lösung und musste ausstehende Anfragen abbrechen, die länger als die letzte / aktuellste Anfrage gedauert haben könnten.

In meinem Fall habe ich so etwas benutzt:

//On document ready
var ajax_inprocess = false;

$(document).ajaxStart(function() {
ajax_inprocess = true;
});

$(document).ajaxStop(function() {
ajax_inprocess = false;
});

//Snippet from live search function
if (ajax_inprocess == true)
{
    request.abort();
}
//Call for new request 

Sie können die Anforderung nicht abrufen, aber Sie können einen Zeitüberschreitungswert festlegen, nach dem die Antwort ignoriert wird. Siehe diese page für jquery AJAX Optionen. Ich glaube, dass Ihr Fehler Callback aufgerufen wird, wenn die Zeitüberschreitung überschritten wird. Für jede AJAX-Anfrage gibt es bereits eine Standard-Zeitüberschreitung.

Sie können auch die abort() -Methode für das Anforderungsobjekt verwenden. Dies führt zwar dazu, dass der Client nicht mehr auf das Ereignis wartet, der Server kann ihn jedoch möglicherweise nicht mehr verarbeiten.


Speichern Sie die Anrufe, die Sie in einem Array tätigen, und rufen Sie dann je xhr.abort () auf.

RIESIGE HÖHE: Sie können eine Anfrage abbrechen, aber das ist nur 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 der Ajax beendet ist. Damit der Benutzer die Website weiter durchsuchen kann, müssen Sie session_write_close () aufrufen. Dies speichert die Sitzung und entsperrt sie, so dass andere Seiten, die darauf warten, fortzufahren, fortfahren werden. Andernfalls können mehrere Seiten darauf warten, dass das Schloss entfernt wird.


Wenn xhr.abort(); bewirkt, dass die Seite neu geladen wird,

Dann können Sie onreadystatechange vor dem Abbruch setzen, um onreadystatechange zu verhindern:

// ↓ prevent page reload by abort()
xhr.onreadystatechange = null;
// ↓ may cause page reload
xhr.abort();

Wie viele Leute im Thread bemerkt haben, wird der Server die Anfrage immer noch verarbeiten, nur weil die Anfrage auf der Client-Seite abgebrochen wird. Dies erzeugt eine unnötige Belastung für den Server, da es Arbeiten ausführt, auf die wir im Front-End nicht mehr hören.

Das Problem, das ich zu lösen versuchte (das andere auch dazu führen können), besteht darin, dass ich, wenn 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 das Snappiness des Frontends beizubehalten, habe ich Folgendes getan:

var xhrQueue = [];
var xhrCount = 0;

$('#search_q').keyup(function(){

    xhrQueue.push(xhrCount);

    setTimeout(function(){

        xhrCount = ++xhrCount;

        if (xhrCount === xhrQueue.length) {
            // Fire Your XHR //
        }

    }, 150);

});

Dies sendet im Wesentlichen alle 150ms eine Anfrage (eine Variable, die Sie für Ihre eigenen Bedürfnisse anpassen können). Wenn Sie nicht genau xhrQueue , was genau hier passiert, loggen Sie xhrCount und xhrQueue vor dem if-Block in die Konsole ein.


es gibt keinen zuverlässigen Weg, es 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 es passieren, dass ein Benutzer zu oft auf eine Schaltfläche klickt, die viele aufeinanderfolgende XHRs auslöst. Hier haben Sie viele Möglichkeiten: entweder die Schaltfläche sperren, bis XHR zurückgegeben wird, oder gar kein neues XHR auslösen, während ein anderer Hinting ausführt der Benutzer, um sich zurückzulehnen - oder verwerfen alle ausstehenden XHR-Antwort, aber die jüngsten.






ajax