Мое веб-приложение использует метод «длинного опроса», чтобы быть в курсе последних данных с моего сервера. Сервер отвечает только тогда, когда у него есть новые данные, которые могут отличаться друг от друга на много минут. (Это система управления отоплением, в которой вы видите обновления только при изменении температуры в помещении или при изменении настроек).
var version = "0";
function updater() {
$.ajax({
type: "POST",
url: "/listen",
data: version,
success: function (data) {
version = handleUpdates(data);
updater();
},
error: function () {
setTimeout(updater, 1000);
}
});
}
Он отлично работает в настольных браузерах и на телефонах, за исключением одного случая. Я обнаружил, что на телефонах Android с Chrome происходит что-то странное после того, как телефон перешел в спящий режим более чем на 10 минут. Почтовый запрос, кажется, отброшен, что, я думаю, разумно, поскольку телефон спит. На вкладке Сеть отладчика Chrome в тексте состояния запроса POST указано (отменено).
Проблема заключается в том, что когда я просыпаю телефон, когда запрос отменен, ни функции success(), ни error() не вызываются, и мое веб-приложение никогда не обновляется. $.ajax() нарушил свое обещание перезвонить мне.
Проблема возникает только на некоторых устройствах. Я смог провести несколько специальных тестов, позаимствовав устройства у друзей. Пока я видел проблему только на телефонах Android. Но телефон не подключен к зарядному устройству. Я не видел его ни на каких планшетах, на устройствах Apple или ПК с Windows.
Я попытался добавить тайм-аут в настройки ajax:
timeout: 120 * 1000,
Это помогает, потому что функция error() в конечном итоге вызывается через 2 минуты после пробуждения. Но я бы хотел, чтобы пользователь видел обновления в течение 1 или 2 секунд. Я не хочу делать тайм-аут таким коротким, потому что это создаст ненужный серверный трафик.
Я также попытался определить, находится ли устройство в спящем режиме, проверив задержку в setInterval в одну секунду, как описано в разделе Могут ли какие-либо настольные браузеры определить, когда компьютер выходит из спящего режима? ?. Когда я обнаруживаю пробуждение, я прерываю пост и начинаю другой. Это помогает в большинстве случаев. Но оказывается ненадежным. Иногда кажется, что временные события продолжают нормально тикать во время сна, и запрос на публикацию все равно отменяется. И это не похоже на надежное решение.
Я использую последнюю версию jQuery: (2.1.2) и Chrome (47).