2011-10-21 36 views
6
  1. Tôi không thực hiện một phép tính lớn trong JS.
  2. Tất cả mọi thứ hoạt động tốt trên iPad iOS 5 trong Safari cho đến khi tôi thêm mã này:Thực thi JavaScript vượt quá thời gian chờ

    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. Sau đó trang web làm việc cho khoảng 4 phút và tôi nhận được lỗi này: thực hiện

    JavaScript vượt hết giờ.

  4. Sau đó, JavaScript sẽ không tải. Không có thông báo gỡ lỗi nào tôi chèn vào tệp my.js sẽ in. Chỉ có lỗi trên.

  5. Lỗi vẫn tồn tại ngay cả sau khi tôi rời trang đã tạo lỗi này và mở các trang web khác trong cùng một miền.

  6. Tôi đã sử dụng thử và nắm bắt, tôi đã sử dụng chức năng setTimeout nhưng không cung cấp cho tôi nguồn gốc của lỗi cũng như không giải quyết được sự cố.

Tôi không biết vấn đề là gì. Nó đã đốt cháy tôi cả ngày và sẽ đốt cháy tôi vào cuối tuần.

+0

Tôi gặp vấn đề tương tự với các trang web khác nhau. Giết tất cả các ứng dụng và khởi động lại Safari "khắc phục" sự cố cho tôi. Vì vậy, nó trông giống như một lỗi trong iOS5. – user123444555621

+0

Tôi tìm thấy trang này theo cách giải thích vấn đề của tôi, nhưng nó không giải thích cách giải quyết nó: http://www.sensiblesoftware.com/weblog/2011/07/06/iphone-javascript-execution-exceeded-timeout/ – YoYoMyo

+0

Xem thêm http://stackoverflow.com/questions/7787219/javascript-ios5-javascript-execution-exceeded-timeout mô tả cùng một triệu chứng (nhưng có thể do một vấn đề hơi khác) – user123444555621

Trả lời

6

Đáng ngạc nhiên, khi tôi sử dụng geolocation.getCurrentPosition, thông báo lỗi đã ngừng hiển thị. Để thay thế watchPosition với getCurrentPosition, tôi sử dụng các chức năng setInterval:

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

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

này đã đề ra tốt hơn so với watchPosition vì watchPosition đôi khi không theo quy tắc (cập nhật vị trí 8 lần trong 3 phút mặc dù tần số được thiết lập để 10 phút).

Nếu thời gian chờ vẫn xảy ra, người ta sẽ cần phải gọi 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

Tôi đã thay thế WatchPosition bằng GetCurrentPosition và nó đã khắc phục vấn đề thời gian chờ này và chúng tôi chưa gặp phải bất kỳ sự cố nào. Có vẻ như triển khai WatchPosition có một số lỗi trong iOS5. Tôi cũng đã xác minh điều này bằng cách thực hiện tương tự với maps.google.com. Trước khi tôi có thể tạo lại ngoại lệ hết thời gian chờ Javascript bằng cách thực hiện theo các bước rất nhỏ và tái tạo ngoại lệ mỗi lần. Bây giờ tôi từ chối bản đồ google để có được vị trí hiện tại của tôi và bây giờ bản đồ đang làm việc tốt ngay cả với các bước chính xác tương tự mà tôi làm theo để tạo ra ngoại lệ thời gian chờ này. Cảm ơn các giải pháp. – Chandramuralis

0

Có lẽ đó là vấn đề Safari chặn tất cả getCurrentPosition khi chạy watchPosition trong một Tab hoặc Website.

0

Tôi gặp sự cố tương tự và tôi cũng sử dụng vị trí địa lý html5.

Tôi đã triển khai giải pháp được đề xuất setInterval(). Vấn đề tương tự vẫn xảy ra, mặc dù mất nhiều thời gian hơn.

tôi đã làm một số thí nghiệm bằng cách đặt đoạn mã sau trong mã của tôi, chỉ để 'tạm dừng' thực thi mã:

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

Đoạn trên chắc chắn sẽ tạo ra một thời gian chờ thực hiện javascript. Tôi lén lút phát hiện ra rằng đoạn mã tiếp theo sẽ tạo ra một thời gian chờ là tốt. Nhưng có vẻ như trình duyệt có thể phục hồi từ thời gian chờ. Đừng hỏi tôi tại sao. Nó chỉ hoạt động. Tôi hy vọng rằng những người bị ảnh hưởng có thể xác minh những phát hiện của tôi.

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

Vì vậy, giải pháp có vẻ là, tầm thường nó có vẻ, đó console.logs nên được thêm vào các phần của mã được gọi là thường xuyên nhất.Tôi hy vọng rằng điều này có thể hữu ích (mặc dù tôi nghĩ nó có vẻ vô lý nhưng nó hoạt động cho tôi)

+0

Tôi đã thử mã ở trên trong Chrome và Firefox, không nhận được lỗi hết thời gian chờ. – YoYoMyo

+0

Tôi nghĩ rằng một cách tốt để đảm bảo getCurrentLocation không hết thời gian chờ là đặt lại khoảng thời gian bằng cách sử dụng clearInterval và ngay lập tức sau đó gọi setInterval (getLocation, 10000) một lần nữa. – YoYoMyo

+0

Btw, mã có nghĩa là được thử trong safari di động. – razorsniper

2

Giống như phụ lục: Vấn đề này tồn tại trên iPhone (không đáng ngạc nhiên) và vẫn không cố định. Thậm chí tệ hơn, nếu bạn thoát (không giết) trình duyệt, bạn sẽ bị cạn kiệt pin, trong vòng 12 giờ điện thoại đã chết. Thật không may, tôi cần phải dựa vào đồng hồ vì getCurrentPosition không quá chính xác.

Khi lỗi đặt trong (sau ~ 4 phút, như được báo cáo), lỗi hết thời gian chờ thực hiện được báo cáo chính xác mỗi giây và công cụ JS đã chết. Vấn đề là nó không phải là một thời gian chờ thực hiện. Đó là lỗi, thậm chí tải lại trang web không thay đổi nó, dừng/bắt đầu đồng hồ cũng không giúp được gì. Chỉ giết trình duyệt (nhấn đúp vào nút, nhấn và giữ biểu tượng, sau đó -) thực hiện thủ thuật.

Dường như chúng ta đang cam chịu cho đến khi phát hành táo một sửa chữa ...

Cập nhật: sau khi thử nghiệm nhiều hơn với điều này có vẻ như vấn đề là yêu cầu XHR, có lẽ jquery cụ thể, có vẻ như có một số giới hạn về những yêu cầu hoặc không dọn dẹp đúng cách. Lỗi thời gian chờ sẽ bật lên trên bất kỳ trang web nào khác cũng như ngay sau khi XHR đầu tiên được kích hoạt. Trước khi tất cả JS chạy tốt.

1

Tôi gặp khó khăn với cùng một vấn đề và tìm thấy một giải pháp khá thanh lịch.

Đã xảy ra lỗi hết thời gian chờ khi tôi bắt đầu 'theo chế độ vị trí' với navigator.geolocation.watchĐặt vị trí và tải lại trang mà không dừng lại. Vì vậy, tôi có thể khắc phục sự cố này chỉ bằng cách xóa người xem khi người dùng rời khỏi trang.

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

Hy vọng điều này sẽ hữu ích!

1

Tôi đang sử dụng watchPosition để đăng lại tốc độ dài, lat và quan trọng nhất của mình. Tôi gặp vấn đề tương tự như người dùng trong chủ đề này: Safari/Chrome trên iOS đã giết nguồn cấp dữ liệu GPS (không phải là khoảng thời gian đã dừng, tôi đã thử nghiệm). Chỉ bằng cách giết chết trình duyệt (như trong nút bấm đúp vào nhà), tôi có thể làm cho nó hoạt động trở lại trong một vài giây. Tôi đã thử tất cả mọi thứ, như thanh toán bù trừ khoảng thời gian nhưng nó không hoạt động. Sau đó, sau đó, tôi đã đi ra ngoài và nó tiếp tục hoạt động! Đã trở lại bên trong và tín hiệu GPS đã biến mất. Vì các ứng dụng như RunKeeper tiếp tục hoạt động bên trong, tôi cho rằng nó cũng hoạt động bên trong, nhưng hóa ra là wrong. Nếu ai có bất kỳ câu hỏi nào, vui lòng hỏi.

Các vấn đề liên quan