JavaScript执行超过了超时

时间:2011-10-21 21:30:15

标签: javascript ipad safari geolocation

  1. 我在JS中没有做大量的计算。
  2. 在我添加此代码之前,Safari iOS iOS 5上的一切正常:

    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函数,但既没有给出错误的来源也没有解决问题。

  7. 我不知道问题所在。它一整天都在燃烧我,并会在周末燃烧我。

6 个答案:

答案 0 :(得分:6)

令人惊讶的是,当我使用geolocation.getCurrentPosition时,错误消息停止显示。 要使用getCurrentPosition替换watchPosition,我使用函数setInterval

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

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

这比watchPosition效果更好,因为watchPosition有时不遵循规则(尽管频率设置为10分钟,但在3分钟内更新位置8次)。

如果仍然发生超时,则需要调用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;
})();

答案 1 :(得分:2)

正如附录一样: 这个问题也存在于iPhone上(并不奇怪),但仍然没有修复。更糟糕的是,如果你退出(而不是杀死)浏览器,你会得到一个电池滤水器,在12小时内手机就会死机。不幸的是,我需要依赖手表,因为getCurrentPosition到目前为止还不够准确。

一旦错误发生(在报告的~4分钟之后),就会每秒报告一次执行超时错误,并且JS引擎已经死亡。问题是它不是执行超时。这就是错误,即使网站重新加载也不会改变它,停止/启动手表也无济于事。只有杀死浏览器(双击按钮,长按图标,然后 - )才能解决问题。

似乎我们注定要失败,直到苹果发布修复......

更新:在对此进行更多实验之后,似乎问题是XHR请求,可能是jquery特定的,似乎对这些请求有一些限制或没有适当的清理。超时错误将在任何其他站点以及第一个XHR被触发时弹出。在所有JS运行正常之前。

答案 2 :(得分:1)

我在同样的问题上挣扎,找到了一个非常优雅的解决方案。

当我使用navigator.geolocation.watchPosition启动“跟随位置模式”并在不停止的情况下重新加载页面时发生超时错误。所以我可以通过在用户离开页面时清除观察者来解决这个问题。

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

希望这有帮助!

答案 3 :(得分:1)

我正在使用watchPosition回发我的长期,最重要的速度。我在这个帖子中遇到了与用户相同的问题:iOS上的Safari / Chrome杀死了GPS提要(这不是停止的间隔,我测试过)。只有通过杀死浏览器(如双击主页按钮),我可以让它再次工作几秒钟。我尝试了所有的东西,比如清除间隔,但它没有用。然后,我出去了,继续工作!回到里面,GPS信号消失了。由于像RunKeeper这样的应用程序继续在内部工作,我认为它也能在内部工作,但结果证明是wrong。如果有人有任何疑问,请随时提出。

答案 4 :(得分:0)

在另一个标签页或网站中运行watchPosition时,可能会阻止所有getCurrentPosition的Safari问题。

答案 5 :(得分:0)

我有类似的问题,我也使用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添加到最常调用的代码部分。我希望这可能会有所帮助(虽然我觉得它看起来很荒谬,但它对我有用)