Wie sende ich eine HTTP-Anfrage in AngularJS vor dem Download?

8

Ich habe eine einfache eckige App, die zwei Ansichten hat, die mit ngRoute geladen werden. Ich muss etwas auf dem Server aufräumen, wenn der Benutzer zwischen Ansichten navigiert und wenn der Benutzer die Seite verlässt (Fenster wird aktualisiert, Tab geschlossen oder Browser geschlossen).

Mein erster Halt war hier: Anzeige in angularjs wenn Benutzer verlässt eine Seite . Es löste den ersten Fall, in dem der Benutzer zwischen Ansichten navigiert. Ich habe die Reinigung wie folgt behandelt:

%Vor%

Ich war jedoch nicht in der Lage, den Fall zu behandeln, in dem der Benutzer die Seite verlässt. Folgen Sie der obigen Antwort und diesem Google Groups-Beitrag: Ссылка Ich habe Folgendes versucht:

%Vor%

Aber es hat nicht funktioniert. Dann habe ich hier gelesen: Wie ajax Funktion onbeforeunload ausführen? dass die Anfrage muss synchron sein und hier: Wie man $ http synchronen Aufruf mit AngularJS dass Angular dies nicht unterstützt (obwohl diese möglicherweise veraltet ist).

Ich habe auch versucht, $ http direkt aufzurufen (ohne den Dienst), aber das hat auch nicht funktioniert. An diesem Punkt stecke ich fest. Irgendwelche Vorschläge / Leads würden wirklich geschätzt werden.

Vielen Dank im Voraus!

    
Levon Tamrazov 10.02.2014, 22:29
quelle

2 Antworten

13

Das Problem ist, dass angular immer ASYNCHRONOUS-Aufrufe mit dem $ http-Service macht (und Sie können dieses Verhalten nicht ändern). Da die Seite beendet wird, bevor der $ http-Dienst eine Chance hat, die Anfragen zu senden, erhalten Sie nicht das gewünschte Ergebnis.

Wenn Sie ein Workarround ohne Verwendung von Bibliotheken von Drittanbietern möchten, versuchen Sie den folgenden Code:

%Vor%

Es wird die Benutzeroberfläche blockieren, bis die Anfrage abgeschlossen ist. Versuchen Sie also, den Server schnell zu machen oder der Benutzer wird bemerken.

    
Joe 21.09.2014 03:34
quelle
7

Die Lösung besteht darin, $rootScope.$digest(); aufzurufen, nachdem Sie Ihre $http -Aufrufe in Ihrem onbeforeunload -Rückruf ausgelöst haben. Der Grund dafür ist, dass die $http -Methoden von angular die Konfiguration in eine sofort aufgelöste Versprechung umbrechen, was bedeutet, dass die Ajax-Anforderung erst beim nächsten Tick ausgelöst wird. Andere Browser scheinen einen Tick mehr nach dem onbeforeunload Tick zu erlauben, aber nicht IE11 (die einzige Version von IE, in der ich getestet habe). Durch das Erzwingen des Digest-Zyklus muss nicht bis zum nächsten Tick gewartet werden.

    
Jason Rust 07.07.2016 17:17
quelle