2010-07-10 3 views
2

"너무 많은 재귀"오류가 발생합니다. 이 문제가 발생하는 실제 응용 프로그램에 명확한 아날로그를 제공하려고 노력할 것입니다.Firefox 3.6.6 및 4.0 베타 1에서 jQuery 사용자 정의 이벤트 및 너무 많은 재귀 오류가 발생했습니다.

앱이 매우 긴화물 열차의 내용에 대한 정보를 얻기 위해 웹 서비스를 호출하려고한다고 상상해보십시오. 우리가 단순히 웹 서비스를 호출 할 수없고 전체 열차의 모든 차량에 대해 모든 것을 한꺼번에 전송할 수는 없다는 많은 정보가 있습니다. 오히려 우리는 웹 서비스에 차례로 각 화물차에 대해 물어보고, 단일 boxcar에 대한 정보가 수신되면 페이지를 업데이트 한 다음 다음 차량을 요청합니다.

반응 클라이언트를 유지하기 위해, 우리는 대신) 루프를 방지하고 array.shift 이벤트를 (사용

우리는 이벤트가 :

$('body').bind('NextBoxCar', function(e, p) { getNexBoxCar(e,p); }); 

을 우리는 첫 번째 boxcarid을 제거하는 기능을 가지고 배열에서와 웹 서비스로 전송 :

EDIT: BoxCarIds is not a global but inside a function 
function() foo { 
    var BoxCarIds = [123, 222, 767, 1234, 9298, ... 999]; 
    $('body').triggerHandler('NextBoxCar', BoxCarIds); 
} 

function getNextBoxCar(e, BoxCarIds) {  

    var id = BoxCarIds.shift(); 

    // build an ajax request; omitted for brevity 
    $.ajax({ 
    . 
    . <snip> 
    . 
    success: function(data, textStatus, oHTTP) { 
     UpdatePage(data, BoxCarIds); 
    } 
    }); 

} 

박스 카에 대한 데이터가 웹 서비스에서 돌아 오면, 아약스 성공 핸들러는 다음과 같은 함수를 호출, 그러면 페이지가 업데이트되고 NextBoxCar 이벤트가 발생합니다. 재귀 문제가 발생하는 곳이라고 생각합니다.

function UpdatePage(data, BoxCarIds) { 

    // update the page with data 
     . 
     . <snip> 
     . 

    // if there are still ids remaining in the array, we need to call the webservice again by firing the event 

    if (BoxCarIds.length > 0) { 
     $('body').triggerHandler('NextBoxCar', BoxCarIds); 

    } 


} 

재귀 문제를 방지하려면 어떻게해야합니까?

감사

답변

2

여기 재귀 부분은 기능에 중요하지 않다.아약스 호출의 결과 일뿐입니다. ajax 호출을 동기식으로 만들고 getNextBoxCar을 루프로 변경할 수 있습니다. 그러나 이는 여전히 페이지를 응답하지 않게합니다.

따라서 setTimeout을 사용하여 UpdatePage 메서드를 호출하여 문제를 해결할 수 있다고 생각합니다. 이것은 재귀를 깨고 페이지를 응답 성있게 유지해야합니다. this jsFiddle example을 참조하십시오. 이로 변경

시도 :

// build an ajax request; omitted for brevity 
$.ajax({ 
    . 
    . <snip> 
    . 
    success: function(data, textStatus, oHTTP) { 
     setTimeout(function() { 
      UpdatePage(data, BoxCarIds); 
     }, 0); 
    } 
}); 
+0

에서만 발생하는 것으로 보입니다. setTimeout 팁을 가져 주셔서 감사 드리며 문제를 해결합니다. – Tim

2

당신은 글로벌 변수로 BoxCarIds 가지고 있지만, 당신은 또한 UpdatePagegetNextBoxCar에 매개 변수로 전달된다. 따라서 UpdatePage 또는 getNextBoxCar 안에있을 때 로컬 버전이 아닌 BoxCarIds의 로컬 버전을 조작하고 있습니다!

매개 변수 BoxCarIdsUpdatePagegetNextBoxCar에서 제거하십시오. 그럼 코드가 잘 작동합니다. 다음은

은 예입니다

var x = 3; 

function Eat(x) 
    { 
     x = 5; 
    } 

alert(x); //alerts 3 
Eat(x); 
alert(x); //alerts 3 

그러나 당신이 먹는에서 매개 변수를 제거하면, 당신은 얻을 :

var x = 3; 

function Eat() 
    { 
     x = 5; 
    } 

alert(x); //alerts 3 
Eat(x); 
alert(x); //alerts 5 
+0

@EndanderedMassa : 감사합니다. BoxCarIds가 실제로 전역 적이 아님을 보여주기 위해이 질문을 수정했습니다. 하지만 이벤트 args에서 두 번째 매개 변수를 제거하고 그 배열을 전역으로 추적한다고 가정 해 보겠습니다. FF에서 너무 많은 재귀 오류가 발생합니다. 이것은 FF에서 문제를 일으키는 것으로 보이는 이벤트 재귀입니다. – Tim

+0

아, 물론. 배열의 크기에 따라 너무 많은 시간을 반복 할 수 있습니다. 나는 다른 대답을 게시 할 것이다. – EndangeredMassa

0

내가 편집 버튼이 표시되지 않는, 그래서 응답 할 것이다 답변과 함께 제안합니다. 댓글에서 읽을 수 있도록 코드를 포맷 할 수 없습니다.

위 질문을 할 때 나는 놀랐다. 사과. 실제 프로그램의 BoxCarIds는 전역이 아닙니다. 프로그램은 다음과 같습니다 :

BoxCarIds 배열의 길이는 실제로 줄어 듭니다. "화물 열차"가 상당히 짧으면 프로그램이 잘 돌아갑니다. 열차가 길 때 (예 : 140 대)에만 오류가 발생합니다.

+0

그리고 오류가 jquery (@ line 55) if (! b) {d = a.type.split ("."); a.type = d.sh ... nt view wheelDelta which "에 있습니다. split (""), http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js 명확한 아이디어를 위해 유엔 버전을 다운로드하려고합니다. 무슨 일이야 – Tim

+0

그리고 FF 3.6.6 (Chrome + Opera는 괜찮습니다.) – Tim

0

'너무 많은 재귀'오류가 JQuery와 1.4.2에서 라인 1936에서 FF 3.6.6에서 일어나는 :

// Filter the functions by class 
1929 if (all || namespace.test(handleObj.namespace)) { 
1930 // Pass in a reference to the handler function itself 
1931 // So that we can later remove it 
1932 event.handler = handleObj.handler; 
1933 event.data = handleObj.data; 
1934 event.handleObj = handleObj; 
1935 
1936 var ret = handleObj.handler.apply(this, arguments); // ERROR HERE 
1937 
1938 if (ret !== undefined) { 
1939 event.result = ret; 
1940 if (ret === false) { 
1941 event.preventDefault(); 
1942 event.stopPropagation(); 
1943 } 
1944 } 
1945 
1946 if (event.isImmediatePropagationStopped()) { 
1947 break; 
1948 } 
1949 } 
1950 } 
관련 문제