2011-10-21 108 views
6
  1. 我没有做一大块计算的JS。
  2. 一切正常在iPad上的iOS 5 Safari浏览器,直到我说这个代码:JavaScript执行超过超时

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

我不知道是什么问题。它一直在烧我整个一天,并将在周末燃烧我。

+0

我对不同的网站有同样的问题。杀死所有应用程序并重新启动Safari为我解决了这个问题。所以它看起来像iOS5中的一个错误。 – user123444555621

+0

我发现这个页面以某种方式解释了我的问题,但没有详细说明如何解决它:http://www.sensiblesoftware.com/weblog/2011/07/06/iphone-javascript-execution-exceeded-timeout/ – YoYoMyo

+0

另请参阅http://stackoverflow.com/questions/7787219/javascript-ios5-javascript-execution-exceeded-timeout其中描述了相同的症状(但可能由一个稍微不同的问题引起) – user123444555621

回答

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分钟不遵守规则(位置更新8次在3分钟内)。

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

我用GetCurrentPosition替换了WatchPosition,它修复了这个超时问题,我们现在没有任何问题。看起来WatchPosition实现在iOS5中有一些错误。我也通过对maps.google.com进行了相同的验证。在我能够通过遵循很少的步骤来重现相同的Javascript超时异常之前,每次都重现异常。现在我拒绝谷歌地图来获得我目前的位置,现在地图工作正常,即使我采用相同的确切步骤来生成此超时异常。感谢您的解决方案。 – Chandramuralis

0

也许是Safari的问题是阻止所有getCurrentPosition在运行watchPosition在另一个选项卡或网站。

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应该被添加到其被称为最常见的代码的部分。我希望这可以有所帮助(尽管我认为它也很荒谬,但它对我很有用)

+0

我在Chrome和Firefox上试过上面的代码,没有得到超时错误。 – YoYoMyo

+0

我认为确保getCurrentLocation不超时的一个好方法是使用clearInterval重置间隔,并在调用setInterval(getLocation,10000)之后立即重新设置。 – YoYoMyo

+0

顺便说一句,代码是要在移动Safari浏览器中试用。 – razorsniper

2

就像一个附录: 这个问题也存在于iPhone上(并不令人惊讶)并且仍然不固定。更糟糕的是,如果您退出(而不是终止)浏览器,则会在12小时内收到电池电量耗尽的消息。不幸的是我需要依靠手表,因为getCurrentPosition远远不够准确。

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

看来,我们注定直到苹果发布补丁...

更新:这个实验更后看来问题是XHR请求,也许jQuery的具体,似乎有对这些请求或部分限制没有适当的清理。超时错误会在第一个XHR被触发时立即弹出。在所有JS运行良好之前。

1

我挣扎于同样的问题,并找到一个相当优雅的解决方案。

当我用navigator.geolocation.watchPosition开始我的'追踪位置模式'时发生超时错误,并重新加载页面而不停止它。所以我可以通过在用户离开页面时清除观察者来解决这个问题。

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

希望这有助于!

1

我正在使用watchPosition发回我的长,经度和最重要的速度。我遇到了与此线程中的用户相同的问题:iOS上的Safari/Chrome杀死了GPS提要(不是停止的间隔,我测试过)。只有通过杀死浏览器(如双击主页按钮),我可以使它再次运行几秒钟。我尝试了一切,如清除间隔,但它没有奏效。然后,我走到外面继续工作!回到里面,GPS信号消失了。由于像RunKeeper这样的应用程序一直在内部工作,我认为它也可以在里面工作,但结果是wrong。如果有人有任何问题,请随时询问。