Автономное событие PhoneGap запускается слишком медленно

В моем приложении PhoneGap я сначала проверяю, подключено ли устройство к Интернету, прежде чем запускать код, вызывать API и т. д.

if (window.navigator.onLine == false) {
    //error handling
} else {
    //do stuff & call API
}

Это отлично работает, но если устройство теряет соединение и страница перезагружается В ТЕЧЕНИЕ 5 секунд или около того после того, как я отключился, код все еще срабатывает и вызывается API, хотя устройство больше не подключено. Если страница перезагружается ПОСЛЕ примерно 5 секунд, обработка ошибок запускается, как и ожидалось.

Таким образом, похоже, что после потери соединения требуется примерно 5 секунд, чтобы перейти в «автономный режим». Я дважды проверил это с помощью автономного события, и оно было запущено только после этих 5 секунд.

document.addEventListener("offline", onOffline, false);

function onOffline() {
    alert("now offline");
}

Итак, есть ли способ немедленно проверить, когда соединение потеряно или отключено или что-то в этом роде?


person Jan Van Echelpoel    schedule 16.03.2015    source источник
comment
Странно - я никогда не видел такой большой задержки, но теоретически вы все равно должны использовать обработчик ошибок для своих сетевых вызовов и обрабатывать ошибки там. Это действительно звучит специфично для меня.   -  person Raymond Camden    schedule 16.03.2015
comment
Да, я сделал это. Просто с ошибками сетевого вызова (тайм-аута) у пользователей есть возможность повторить попытку, что затем становится бессмысленным, поскольку фактического соединения нет. Чтобы они могли попробовать еще раз... навсегда.   -  person Jan Van Echelpoel    schedule 16.03.2015
comment
На конкретном устройстве: только что протестировано на симуляторе iOS, и событие запускается почти сразу, на iPad 3 и iPhone 6 запускается через 6 секунд.   -  person Jan Van Echelpoel    schedule 16.03.2015


Ответы (1)


Если проблема связана именно с проверкой онлайн-статуса непосредственно при загрузке страницы, используйте плагин сетевой информации и вызовите функцию сразу после завершения загрузки страницы:

function checkConnection() {
    var networkState = navigator.network.connection.type;
    var states = {};
    states[Connection.UNKNOWN]  = false;
    states[Connection.ETHERNET] = true;
    states[Connection.WIFI]     = true;
    states[Connection.CELL_2G]  = true;
    states[Connection.CELL_3G]  = true;
    states[Connection.CELL_4G]  = true;
    states[Connection.NONE]     = false;
    return states[networkState];
}

События offline и online работают именно тогда, когда приложение используется. Плагин сетевой информации может возвращать статус соединения, как только срабатывает событие deviceready.

person Dawson Loudon    schedule 16.03.2015
comment
Пробовал с плагином сетевой информации и проверял, если navigator.network.connection.type == Connection.NONE . Все еще 5-секундный промежуток перед отключением замечен. - person Jan Van Echelpoel; 16.03.2015
comment
с iOS вам действительно нужна проверка для UNKNOWN. Я пытался найти документ, объясняющий это, но не мог вспомнить, где я его нашел. - person Dawson Loudon; 17.03.2015
comment
Пробовал, все еще 5-секундный разрыв. Угадайте, что это зависит от устройства, поскольку в симуляторе iOS нет пробела. - person Jan Van Echelpoel; 18.03.2015