Gegeben eine Ajax-Anfrage in AngularJS
$http.get("/backend/").success(callback);
Was ist der effektivste Weg, um diese Anforderung abzubrechen, wenn eine andere Anforderung gestartet wird (z. B. dasselbe Backend, unterschiedliche Parameter)?
Gegeben eine Ajax-Anfrage in AngularJS
$http.get("/backend/").success(callback);
Was ist der effektivste Weg, um diese Anforderung abzubrechen, wenn eine andere Anforderung gestartet wird (z. B. dasselbe Backend, unterschiedliche Parameter)?
promise.abort()
stackoverflow.com/a/50415480/984780Antworten:
Diese Funktion wurde der Version 1.1.5 über einen Timeout-Parameter hinzugefügt :
quelle
setTimeout
Funktion oder mit dem Angular-$timeout
Dienst.Das Abbrechen von Angular $ http Ajax mit der Eigenschaft timeout funktioniert in Angular 1.3.15 nicht. Für diejenigen, die nicht darauf warten können, dass dies behoben wird, teile ich eine in Angular verpackte jQuery Ajax-Lösung.
Die Lösung umfasst zwei Dienste:
Hier geht der PendingRequestsService-Dienst:
Der HttpService-Dienst:
Später in Ihrem Dienst, wenn Sie Daten laden, würden Sie den HttpService anstelle von $ http verwenden:
Später in Ihrem Code möchten Sie die Daten laden:
quelle
Das Abbrechen von Anforderungen mit
$http
wird mit der aktuellen Version von AngularJS nicht unterstützt. Es wurde eine Pull-Anfrage geöffnet , um diese Funktion hinzuzufügen, aber diese PR wurde noch nicht überprüft, sodass nicht klar ist, ob sie in den AngularJS-Kern gelangen wird.quelle
Wenn Sie ausstehende Anforderungen auf stateChangeStart mit dem UI-Router abbrechen möchten, können Sie Folgendes verwenden:
// im Dienst
// in der UIrouter-Konfiguration
quelle
request.timeout
vorhanden ist?Aus irgendeinem Grund funktioniert config.timeout bei mir nicht. Ich habe diesen Ansatz verwendet:
Und cancelRequest.resolve (), um abzubrechen. Eigentlich wird eine Anfrage nicht abgebrochen, aber Sie erhalten zumindest keine unnötige Antwort.
Hoffe das hilft.
quelle
{ cancelPromise, httpPromise }
?Dies verbessert die akzeptierte Antwort, indem der $ http-Dienst wie folgt mit einer Abbruchmethode dekoriert wird ...
WAS MACHT DIESER CODE?
Um eine Anfrage abzubrechen, muss ein "Versprechen" -Zeitlimit festgelegt werden. Wenn für die HTTP-Anforderung kein Zeitlimit festgelegt ist, fügt der Code ein "Versprechen" -Zeitlimit hinzu. (Wenn bereits eine Zeitüberschreitung eingestellt ist, wird nichts geändert).
Um das Versprechen zu lösen, brauchen wir jedoch einen Griff auf den "Aufgeschobenen". Wir verwenden daher eine Karte, damit wir die "zurückgestellten" später abrufen können. Wenn wir die Abbruchmethode aufrufen, wird das "Zurückgestellte" aus der Karte abgerufen, und dann rufen wir die Auflösungsmethode auf, um die http-Anforderung abzubrechen.
Hoffe das hilft jemandem.
EINSCHRÄNKUNGEN
Derzeit funktioniert dies nur für $ http.get, Sie können jedoch Code für $ http.post usw. hinzufügen
WIE BENUTZT MAN ...
Sie können es dann beispielsweise bei Statusänderungen wie folgt verwenden ...
quelle
Hier ist eine Version, die mehrere Anforderungen verarbeitet und im Rückruf nach dem Status "Abgebrochen" sucht, um Fehler im Fehlerblock zu unterdrücken. (in Typoskript)
Controller-Ebene:
in meinem http bekommen:
Hilfsmethoden
Wenn ich jetzt auf die Registerkarte "Netzwerk" schaue, sehe ich, dass es wunderbar funktioniert. Ich habe die Methode 4 Mal aufgerufen und nur die letzte ist durchgegangen.
quelle
Sie können dem
$http
Service eine benutzerdefinierte Funktion hinzufügen, indem Sie einen "Dekorator" verwenden, der dieabort()
Funktion Ihren Versprechungen .Hier ist ein Arbeitscode:
Dieser Code verwendet die Decorator-Funktionalität von anglejs, um
with_abort()
dem$http
Service eine Funktion hinzuzufügen .with_abort()
Verwendet$http
Timeout-Option, mit der Sie eine http-Anforderung abbrechen können.Das zurückgegebene Versprechen wird geändert, um eine
abort()
Funktion einzuschließen. Es hat auch Code, um sicherzustellen, dass dieabort()
funktioniert, auch wenn Sie Versprechen verketten.Hier ist ein Beispiel, wie Sie es verwenden würden:
Standardmäßig, wenn Sie anrufen
abort()
die Anforderung abgebrochen und keiner der Versprechen-Handler wird ausgeführt.Wenn Sie möchten, dass Ihre Fehlerbehandlungsroutinen als pass true to bezeichnet werden
abort(true)
.In Ihrem Fehlerbehandler können Sie überprüfen, ob der "Fehler" auf einen "Abbruch" zurückzuführen ist, indem Sie die
xhrStatus
Eigenschaft überprüfen . Hier ist ein Beispiel:quelle