2011-10-16 3 views
7

다음 테스트는 기본적으로 ~ 1000 수학 연산이며 대부분의 PC 및 Android 브라우저 및 iOS 4.x에서 정상적으로 작동합니다. iOS5 사파리 (iPhone 4 및 iPad 2)에서 "JavaScript : 오류 미확인 자바 스크립트 실행 시간 초과"가 표시됩니다. 어떤 도움이라도 대단히 감사합니다.Javascript IOS5 "JavaScript 실행이 시간 초과되었습니다"

/** Converts numeric degrees to radians */ 
if (typeof (Number.prototype.toRad) === "undefined") { 
    Number.prototype.toRad = function() { 
    return this * Math.PI/180; 
    } 
} 

function gc(lat1, lon1, lat2, lon2) { 
    // returns the distance in km between a pair of latitude and longitudes 
    var R = 6371; // km 
    var dLat = (lat2 - lat1).toRad(); 
    var dLon = (lon2 - lon1).toRad(); 
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
     Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * 
     Math.sin(dLon/2) * Math.sin(dLon/2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
    var d = R * c; 
    return d; 
} 

function test() { 
    var d1 = new Date(); 
    var lat1, lon1, lat2, lon2; 
    lat1 = -36; 
    lon1 = 174; 

    lat2 = lat1; 
    lon2 = lon1; 

    while (lat2 > -37) { 
    lat2 = lat2 - 0.001; 
    var stest = "lat1=" + lat1 + ",lon1=" + lon1 + ",lat2=" + lat2 + ",lon2=" + lon2 + "=" + gc(lat1, lon1, lat2, lon2); 

    } 
    var d2 = new Date(); 
    var stest = (d2.getTime() - d1.getTime())/1000.0 + "s"; 
    $("#lblTest").html(stest + "<BR/>" + $("#lblTest").html()); 

} 
+0

시간 초과를 유발하는 기능은 무엇입니까? – Zakaria

+0

안녕하세요 Zakaria 나는 1000 회까지 – ajayel

답변

10

javascript에서 장기 실행 작업을 실행하려는 경우 일부 브라우저에서 시행되는 스크립트 실행 시간 제한에 근접한 위치에있는 경우 함수를 여러 조각으로 나누고 한 조각을 실행하여 매우 짧은 setTimeout(fn, 1)을 실행하고 다음 조각 등을 실행하십시오. 이렇게하면 다른 스크립트와 다른 이벤트에 처리 기회가 주어 지므로 몇 시간 동안 코드를 실행할 수 있습니다. 때때로이 작업을 수행하려면 약간의 코드 재구성이 필요하지만, 약간의 작업만으로 항상 가능합니다.

의사 코드의 기본 개념이 될 것입니다 : 특정 코드에서

var state = {}; // set initial state 
var done = false; 

function doWork() { 
    // do one increment of work that will never get even close to the browser 
    // execution time limit 
    // update the state object with our current operating state for the next execution 
    // set done = true when we're done processing 
    if (!done) { 
     setTimeout(doWork, 1); 
    } 
} 

doWork(); 

, 당신은 같은 것을 할 수 있습니다. 한 번에 100 개의 위도 점을 처리 한 다음 짧은 setTimeout을 수행하여 다음 100을 수행 할 수 있습니다. 100 개의 숫자를 가장 잘 작동하는 것으로 조정할 수 있습니다. 숫자가 높을수록 각 타이머 및 전반적인 실행 시간은 늘어나지 만 브라우저 스크립트 실행 한계에 가까워집니다. 에서는 setTimeout은 (다른 이벤트를 처리) 살아 브라우저를 유지하고에서 발로에서 실행 시간 제한을 방지 할 수 있습니다.

function test() { 
    var d1 = new Date(); 
    var lat1, lon1, lat2, lon2, done = false;; 
    lat1 = -36; 
    lon1 = 174; 

    lat2 = lat1; 
    lon2 = lon1; 

    function calcGC() { 
     var cntr = 0; 
     while (lat2 > -37 && cntr < 100) { 
      lat2 = lat2 - 0.001; 
      var stest = "lat1=" + lat1 + ",lon1=" + lon1 + ",lat2=" + lat2 + ",lon2=" + lon2 + "=" + gc(lat1, lon1, lat2, lon2); 
      cntr++; 
     } 
     // if we have more to go, then call it again on a timeout 
     if (lat2 > -37) { 
      setTimeout(calcGC, 1); 
     } else { 
      var d2 = new Date(); 
      var stest = (d2.getTime() - d1.getTime())/1000.0 + "s"; 
      $("#lblTest").html(stest + "<BR/>" + $("#lblTest").html()); 
     } 
    } 
    calcGC(); 
} 
+0

이 우수한 설명 jfriend00 예제는 최대한 빨리이 페이지에서 시도해 보겠습니다. 훌륭한! – ajayel

+0

을 구현하고 잘 작동합니다. 다시 한 번 감사드립니다. jfriend00 – ajayel

1

Apple과 같은 사운드는 iOS5에서 javascript의 실행 시간 제한을 줄였습니다. 이것은 아마도 Mobile Safari의 일반적인 속도 개선과 UIWebViews 용 Nitro 엔진의 포함 때문일 것입니다.

+0

gc()를 호출하기 때문에 생산 코드의 오류를 시뮬레이트하는 test()를 호출해야합니다. 우리 코드는 iOS4에서 잘 작동하고 일관되게 실행됩니다. – ajayel

4

내 느낌은 iOS5를 사파리에 버그가 있다는 사실이다, 한 번 나는 이러한 오류를하기 시작했기 때문에 , Google 모바일 검색 페이지를 포함하여 모든 곳에서 볼 수 있으며 타임 아웃이나 일시 중지가 표시되지 않습니다. 사파리를 죽이고 다시 시작하면 문제가 해결됩니다 (다시 발생하기 전까지는 사파리를 처음 깨진 상태로 만드는 진정한 타임 아웃 일 것입니다).

멀티 태스킹 메뉴를 통해 Safari를 죽이고 재시작 해 보셨습니까?

0

나도 IOS5 브라우저 버그라고 생각합니다. 비슷한 문제가 있습니다. 우리는 Javascript 코드가 많은 대규모 RIA 응용 프로그램을 가지고 있으며 페이지를 새로 고친 후 브라우저가 제한 시간 초과 예외를 throw하기 시작합니다. iOS4에는이 문제가 없습니다. 예외가 발생하기 시작하면 브라우저가 완전히 고장 나기 전까지는 상황이 나 빠지게됩니다. 다른 관련이없는 페이지는 예외를 발생시키고 렌더링을 거부합니다.

Safari를 종료하고 다시 시작하면 문제가 해결됩니다.

+0

안녕하세요. VladH와 Will Dean은 새로운 브라우저에서도 일관되게 오류를 재현 할 수 있었고 jfriend00s 접근 방식으로 완전히 사라졌습니다. 흥미롭게도 두 개의 브라우저 (또는 전체 화면 웹) 창에서 동일한 코드가 동시에 실행되는 경우 원래 질문에 설명 된 javascript 오류가 발생합니다. – ajayel

+0

@VladH, 앱에서 window.setTimeout 또는 window.setInterval을 사용하고 있습니까? – illvm

+0

아니요, 우리는 여전히 응용 프로그램의 정확히 어디에서 시간 제한을 발생시키는 부분인지 정확히 찾아 내기 위해 노력하고 있습니다. 우리의 응용 프로그램은 방대하고 비동기식입니다. 그러나 해결 방법을 찾아 낼 때조차 더 큰 문제가 있습니다. 일단 이러한 시간 초과 오류가 나타나기 시작하면 Safari가 고장납니다. 하나는 페이지를 몇 번 새로 고칩니다. 이제 문제가없는 JS 스크립트가 작동하지 않습니다. 관련없는 사이트는 별도의 탭에 있습니다. 우리 스크립트는 브라우저를 깨뜨릴 수 없어야합니다. BTW, 우리는 방금 위성지도를 켜고 끄는 것으로 Google지도 사이트에서이를 재현했습니다. – VladH