Превышено время ожидания выполнения JavaScript - PullRequest
6 голосов
/ 22 октября 2011
  1. Я не делаю большой кусок вычислений в JS.
  2. Все отлично работает на iPad iOS 5 в Safari, пока я не добавил этот код:

    var watchID = navigator.geolocation.watchPosition(updatePos,locationError,{maximumAge: 10000, frequency: 60000, enableHighAccuracy: true, timeout: 1000});
    
    function updatePos(position) {       
        if (position.coords.accuracy < accuracyThreshold) {                 
            $.post(websiteRoot + '/ReportDeviceLocation?rand=' + (Math.random() * Math.random()) + '&longitude=' + position.coords.longitude + '&latitude=' +position.coords.latitude);
    
        } else {
            console.debug("Location data is not accurate enough. Location not updated.");
        }
    }
    
  3. Затем веб-страница работала около 4 минут, и я получаю эту ошибку:

    Превышено время ожидания выполнения JavaScript.

  4. Тогда не будет загружаться JavaScript. Ни одно из сообщений отладки, которые я вставил в файл my.js, не печаталось. Только вышеуказанная ошибка.

  5. Ошибка сохраняется даже после того, как я покинул страницу, на которой возникла эта ошибка, и открыл другие веб-страницы в том же домене.

  6. Я использовал try и catch, я использовал функцию setTimeout, но не дал мне ни источника ошибки, ни решил проблему.

Я не знаю, в чем проблема. Он жжет меня весь день и будет жечь меня на выходных.

Ответы [ 6 ]

6 голосов
/ 24 октября 2011

Удивительно, но когда я использовал geolocation.getCurrentPosition, сообщение об ошибке перестало отображаться.Чтобы заменить watchPosition на getCurrentPosition, я использую функцию setInterval:

        function getLocation() {
            navigator.geolocation.getCurrentPosition(updatePos, locationError, { enableHighAccuracy: true, timeout: 10000 });
        }

        var intervalID = window.setInterval(getLocation, 10000);

Это сработало лучше, чем watchPosition, потому что watchPosition иногда не следует правилам (обновить местоположение 8 раз за 3 минуты, несмотря на установленную частотудо 10 минут).

Если тайм-аут все еще происходит, необходимо вызвать clearInterval:

var geolocationID;
(function getLocation() {
     var count = 0;
     geolocationID = window.setInterval(
       function () {
            count++;
            if (count > 3) {  //when count reaches a number, reset interval
                window.clearInterval(geolocationID);
                getLocation();
            } else {
                navigator.geolocation.getCurrentPosition(updatePos, locationError, { enableHighAccuracy: true, timeout: 10000 });
            }
        },
        600000); //end setInterval;
})();
2 голосов
/ 04 января 2012

Просто как дополнение: Эта проблема существует и на iPhone (что неудивительно) и до сих пор не устранена. Еще хуже, если вы выйдете (не убьете) браузер, вы получите аккумулятор, в течение 12 часов телефон разрядится. К сожалению, мне нужно положиться на часы, так как getCurrentPosition далеко не так точен.

Как только ошибка устанавливается (через ~ 4 минуты, как сообщается), ошибка тайм-аута выполнения выдается ровно каждую секунду, и механизм JS не работает. Проблема в том, что это НЕ время ожидания выполнения. Это ошибка, даже перезагрузка сайта не меняет ее, остановка / запуск часов тоже не помогает. Только убить браузер (двойное нажатие на кнопку, долгое нажатие на иконку, затем -) добивается цели.

Кажется, мы обречены, пока Apple не выпустит исправление ...

Обновление: после дальнейших экспериментов с этим кажется, что проблема связана с запросами XHR, возможно, специфичными для jquery, кажется, что есть некоторые ограничения на эти запросы или нет надлежащей очистки. Ошибка тайм-аута появится на любом другом сайте, а также при запуске первого XHR. До этого все JS работает нормально.

1 голос
/ 16 декабря 2012

Я использую watchPosition, чтобы опубликовать мою длинную, последнюю и самую важную скорость.У меня возникла та же проблема, что и у пользователей в этой теме: Safari / Chrome на iOS отключил канал GPS (это был не интервал, который остановился, я тестировал)Только убив браузер (как при двойном нажатии кнопки «Домой»), я мог заставить его работать снова на пару секунд.Я попробовал все, как очистка интервала, но это не сработало.Потом я вышел на улицу, и она продолжала работать!Вернулись внутрь и пропал сигнал GPS.Поскольку приложения, такие как RunKeeper, продолжали работать внутри, я предполагал, что оно будет работать и внутри, но это оказалось неправильно .Если у кого-то есть какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать.

1 голос
/ 23 февраля 2012

Я боролся с той же проблемой и нашел довольно элегантное решение.

Произошли ошибки тайм-аута, когда я запустил свой «режим отслеживания местоположения» с navigator.geolocation.watchPosition и перезагрузил страницу, не останавливая ее. Так что я мог бы решить эту проблему, просто очистив наблюдателя, когда пользователь покидает страницу.

$(window).unload(function(){
  window.navigator.geolocation.clearWatch(myWatchHandler);
});

Надеюсь, это поможет!

0 голосов
/ 26 октября 2011

У меня была похожая проблема, и я также использую геолокацию html5.

Я уже реализовал предложенное решение setInterval(). Та же проблема все еще возникала, хотя и занимала гораздо больше времени.

Я немного поэкспериментировал, вставив в свой код следующий фрагмент, просто чтобы «приостановить» выполнение кода:

ms = 30000;
ms += new Date().getTime();
while (new Date() < ms){
}

Приведенный выше фрагмент надежно генерирует тайм-аут выполнения JavaScript. Я тайно обнаружил, что следующий фрагмент также сгенерирует тайм-аут. Но похоже, что браузер способен восстанавливаться по таймауту. Не спрашивай меня почему. Это просто работает. Я надеюсь, что пострадавшие смогут проверить мои выводы.

ms = 30000;
ms += new Date().getTime();
while (new Date() < ms){
    if (new Date() %100 == 0){
        console.log('in while');
    }
}

Итак, решение выглядит как , может показаться тривиальным, что console.logs следует добавлять в части кода, который вызывается чаще всего. Я надеюсь, что это может быть полезно (хотя я думаю, что это тоже кажется смешным, но это работает для меня)

0 голосов
/ 25 октября 2011

Возможно, это проблема Safari, которая блокирует все getCurrentPosition при запуске watchPosition в другой вкладке или на веб-сайте.

...