В моем веб-приложении используется метод "long poll", чтобы быть в курсе последних данных с моего сервера. Сервер реагирует только тогда, когда у него есть новые данные, которые могут находиться в нескольких минутах друг от друга. (Это система управления отоплением, в которой вы видите только обновления при изменении комнатной температуры или кто-то меняет настройки).
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. Но телефон не подключен к зарядному устройству. Я не видел его ни на каких планшетах, на яблочных устройствах или Windows-ПК.
Я попытался добавить тайм-аут к настройкам ajax:
timeout: 120 * 1000,
Это помогает, потому что функция error() в конечном итоге вызывается через 2 минуты после пробуждения. Но я хотел бы, чтобы пользователь видел обновления в течение 1 или 2 секунд. Я не хочу, чтобы тайм-аут был настолько коротким, что он создавал бы ненужный трафик сервера.
Я также попытался обнаружить, что устройство спит, ища опоздание за одну секунду setInterval, как описано в Могут ли какие-либо настольные браузеры обнаруживать, когда компьютер возобновляет сна?, Когда я обнаруживаю пробуждение, я прерываю() сообщение и запускаю другое. Это помогает в большинстве случаев. Но это оказывается ненадежным. Иногда временные события, похоже, обычно сохраняют тиканье во время сна, и почтовый запрос все равно отменяется. И это не похоже на надежное решение.
Я использую последнюю версию jQuery: (2.1.2) и Chrome (47).