Офлайн събитието 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