Meine Webanwendung verwendet die Methode 'lang poll', um mit den neuesten Daten von meinem Server auf dem neuesten Stand zu bleiben. Der Server reagiert nur auf neue Daten, die viele Minuten auseinander liegen können. (Es ist ein Heizungssteuerungssystem, in dem Sie nur Aktualisierungen sehen, wenn sich die Raumtemperatur ändert oder jemand die Einstellungen ändert).Long-Poll jQuery.ajax() schlägt fehl, nachdem Telefon schläft?
Es funktioniert gut auf Desktop-Browsern und auf Handys außer in einem Fall. Ich habe festgestellt, dass auf Android-Handys mit Chrome etwas seltsam passiert, nachdem das Telefon für mehr als etwa 10 Minuten eingeschlafen ist. Die Post-Anfrage scheint fallen gelassen zu werden, was ich für vernünftig halte, da das Telefon schläft. Auf der Registerkarte "Netzwerk" des Chrome-Debuggers wird der Statustext der POST-Anforderung angezeigt (abgebrochen).
Das Problem ist, wenn ich das Telefon wecken, während die Anfrage abgebrochen wird, weder die Funktion success() oder error() aufgerufen wird, und meine Web-App wird nie aktualisiert. $ .ajax() hat sein Versprechen gebrochen, mich zurückzurufen.
Das Problem tritt nur bei einigen Geräten auf. Ich konnte einige Ad-hoc-Tests durchführen, indem ich Geräte von Freunden entlehnt habe. Bis jetzt habe ich nur das Problem auf Android-Handys gesehen. Aber nicht ist das Telefon an ein Ladegerät angeschlossen. Ich habe es auf keinem Tablet, auf Apple-Geräten oder Windows-PCs gesehen.
Ich habe versucht, einen Timeout auf die Ajax-Einstellungen hinzugefügt:
timeout: 120 * 1000,
Dies trägt dazu bei, da die Fehler() Funktion schließlich bis zu 2 Minuten nach dem Aufwachen genannt wird. Aber ich möchte, dass der Benutzer Updates innerhalb von 1 oder 2 Sekunden sieht. Ich möchte das Timeout nicht so kurz machen, weil es unnötigen Serververkehr verursachen würde.
Ich habe auch versucht, zu erkennen, ob das Gerät schläft, indem ich nach einer Verspätung in einer Sekunde setInterval suche, wie in Can any desktop browsers detect when the computer resumes from sleep? beschrieben. Wenn ich den Aufweck erfahre, breche ich den Post ab und starte einen anderen. Dies hilft in den meisten Fällen. Aber es erweist sich als unzuverlässig. Manchmal scheinen Zeitereignisse während des Schlafs normal zu ticken und die Postanforderung wird trotzdem abgebrochen. Und es fühlt sich nicht wie eine zuverlässige Lösung an.
Ich benutze die neueste Version von jQuery: (2.1.2) und Chrome (47).
versuchen Sie, die aktuelle Zusage global zu speichern. Wenn Sie diesen fehlgeschlagenen Status eingeben, überprüfen Sie die .state() der Zusage. Was enthält es? Wenn es etwas anderes als "pending" enthält, können Sie es zusammen mit der Lösung von @ spozun verwenden, um die Dinge nach einer Schlafperiode zu starten, ohne die Anfragen unnötig zu löschen. –