Wie kann ich eine $ http Anfrage in AngularJS abbrechen?
Gegeben ein Ajax-request in AngularJS
$http.get("/backend/").success(callback);
was ist der effektivste Weg, um zu stornieren, wenn eine andere Anfrage gestartet wird (gleiche backend, verschiedene Parameter, zum Beispiel).
InformationsquelleAutor der Frage mpm | 2012-12-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Funktion wurde Hinzugefügt, um die Version 1.1.5 über einen timeout-parameter:
InformationsquelleAutor der Antwort lambinator
Cancelling-Eckig $http Ajax mit der timeout-Eigenschaft funktioniert nicht in Eckige 1.3.15.
Für diejenigen, die nicht warten können, bis dies behoben wird bin ich teilen ein jQuery-Ajax-Lösung verpackt in Eckig.
Die Lösung umfasst zwei Dienste:
Hier geht der PendingRequestsService service:
Die HttpService-service:
Später in Ihrem Dienst, wenn Sie Daten laden möchten, verwenden Sie die HttpService-statt $http:
Später in Ihrem code, den Sie möchten, um die Daten zu laden:
InformationsquelleAutor der Antwort Edward Olamisan
Stornierung von Anfragen ausgestellt
$http
wird nicht unterstützt mit der aktuellen version von AngularJS. Es ist ein pull-request eröffnet hinzufügen diese Funktion aber diese PR nicht überprüft, aber so ist es nicht klar, ob sein gehen, um es in AngularJS-core.InformationsquelleAutor der Antwort pkozlowski.opensource
Wenn Sie Abbrechen möchten anhängigen Anträge auf stateChangeStart mit ui-router, die Sie verwenden können, so etwas wie dieses:
//in service
//in UIrouter config
InformationsquelleAutor der Antwort SonTL
Erhöht dies die akzeptierte Antwort durch die Dekoration der $http-service mit einer abort-Methode wie folgt ...
WAS DIESER CODE TUT?
Stornieren Sie eine Anfrage ein "Versprechen" timeout-muss gesetzt sein.
Wenn kein timeout festgelegt ist, auf der HTTP-request wird dann der code fügt ein "Versprechen" timeout.
(Wenn ein Zeitlimit gesetzt ist dann schon nichts geändert wird).
Jedoch zu lösen, das Versprechen, das wir benötigen ein handle auf die "latenten".
Deshalb verwenden wir eine Karte, damit wir abrufen können, die "latente" später.
Beim aufrufen der abort-Methode, die "latente" wird abgerufen, aus der Karte und dann rufen wir die resolve-Methode zum Abbrechen der http-Anforderung.
Hoffe, das jemand hilft.
EINSCHRÄNKUNGEN
Derzeit funktioniert dies nur für $http.bekommen, aber Sie können code hinzufügen, für $http.post und so weiter
VERWENDUNG ...
Dann können Sie es, zum Beispiel, auf Zustand zu ändern, wie folgt ...
InformationsquelleAutor der Antwort danday74
hier ist eine version, die verarbeitet mehrere Anfragen, prüft auch, ob storniert-status-callback zu unterdrücken, um Fehler in Fehler-block. (Typoskript)
controller-Ebene:
in meinem http-get:
helper-Methoden
schauen jetzt auf die Registerkarte "Netzwerk", ich sehe, dass es funktioniert beatuifully. ich nannte die Methode, die 4 mal und nur das Letzte ging durch.
InformationsquelleAutor der Antwort Sonic Soul
Können Sie eine benutzerdefinierte Funktion hinzufügen, um die
$http
Dienst über ein "Dekorateur", das wäre dieabort()
Funktion zu Ihrem Versprechen.Hier einige arbeiten code:
Dieser code verwendet angularjs Symbol Funktionen zum hinzufügen von ein
with_abort()
- Funktion, um die$http
service.with_abort()
verwendet$http
timeout-option, die erlaubt, dass Sie zum Abbruch einer http-Anforderung.Den zurückgegebenen Versprechen ist verändert, um eine
abort()
Funktion. Es hat auch code, um sicherzustellen, dass dieabort()
funktioniert sogar, wenn Sie die Kette verspricht.Hier ist ein Beispiel, wie Sie es verwenden würden:
Standardmäßig beim Aufruf
abort()
die Anfrage wird abgebrochen und keines der Versprechen-Handler ausgeführt.Wenn Sie möchten, dass Ihre Fehler-Handler aufgerufen werden, übergeben Sie true, um
abort(true)
.In der Fehlerbehandlung können Sie überprüfen, ob der "Fehler" wurde durch ein "abort" durch die überprüfung der
xhrStatus
Eigenschaft. Hier ist ein Beispiel:InformationsquelleAutor der Antwort Luis Perez