2011-10-20 3 views
1

콜백, 범위 및 종료와 관련하여 많은 질문이 있다는 것을 알고 있습니다. 이것이 중복되면 미리 사과드립니다.반복 중 콜백 범위

몇 가지 비동기 작업을 수행 한 다음 콜백을 발행하는 함수를 호출하는 각 루프가 있습니다. 콜백이 발생할 때 나는 범위를 잃어 가고있다. 내가 한 것은 루프에있는 항목을 함수에 전달한 다음 콜백으로 반환하므로 필요한 범위가 있습니다. 이것이 최선의 방법인가요? 지나치게 복잡한 것을 찾고있는 것이 아닙니다. 나는 단지 내가 어떤 "어려움"을 겪지 않을 것인지 확인하고 싶다. 당신이있어 무엇

function doSomething(varA, varB, self, callback) { 
    // do a lot of ajax stuff 
    callback(varA + varB, self); 
} 

$.each($('.selected'), function(i, item) { 
    doSomething('a', 'b', item, function(retVal, self) { 
    // process retVal and self 
    } 
} 

답변

2

잘하지만, 한 가지를 찾습니다 .each() 대신 $.each()를 사용하여. 이 시도 :

$('.selected').each(function(i, item) { 
    doSomething('a', 'b', item, function(retVal, self) { 
    // process retVal and self 
    } 
} 
+0

내가 가진 것보다 더 나은 구문. – Jay

1

당신이doSomething 내부 요소 참조 이 필요하지 않은 경우, 당신은이에 폐쇄를 만들 수 있습니다, 약간 정돈 방법 :

function doSomething(varA, varB, callback) { 
    // do a lot of ajax stuff 
    callback(varA + varB); 
} 

$.each($('.selected'), function() { 
    var self = this; 
    doSomething('a', 'b', function(retVal) { 
    // process retVal and self 
    } 
}); 
+0

저는 실제로이 방법으로 클로저를 사용하려고했습니다. 자기가 루프 안에 있다면 범위를 잃어 버렸습니다. 루프 외부로 이동 한 경우 콜백이 발생하기 전에 루프가 여러 번 실행되고 자체의 값이 변경됩니다. 문제는 루프가 계속 힘들어하고 콜백이 계속 실행된다는 것입니다. – Jay

0

주요 "잡았다"사람들이 실행 into into ajax와 루프는 나중에 실행되는 함수 내에서 반복 변수를 재사용하려고합니다. 예를 들어

for (var i in col) { 
    $.ajax({ 
    url: '...' + i + '.html', 
    success: function() { 
     console.log(i); // Why is i different??? 
    } 
    }); 
} 

이쪽 success 콜백의 모든 사이에 공유 i의 한 인스턴스가 있기 때문에 "잡았다"발생합니다.

모든 "반복"수준에 대해 하나의 i이 있지만 시나리오에서는 그래서이 잡아는 널 때리지 않을거야.

0

함수 내에서 callback이 정의되었으므로 item은 여전히 ​​콜백 기능을 사용할 때까지 범위 내에 있습니다. 따라서 doSomething()self을 사용하지 않으면 전달할 필요가 없습니다. 당신은 item를 참조 할 수 있습니다 : 콜백이 .each()의 외부에서 정의 된 경우

function doSomething(varA, varB, callback) { 
    // do a lot of ajax stuff 
    callback(varA + varB); 
} 

$('.selected').each(function(i, item) { 
    doSomething('a', 'b', function(retVal) { 
    // process retVal and item 
    }); 
}); 

이제, 당신이 당신이 그것을 가지고하는 방법을해야 할 것, itemdoSomething()에 통과 : 즉

function doSomething(varA, varB, self, callback) { 
    // do a lot of ajax stuff 
    callback(varA + varB, self); 
} 
function doSomethingCallback(retVal, self) { 
    // process retVal and item 
} 

$('.selected').each(function(i, item) { 
    doSomething('a', 'b', item, doSomethingCallback); 
}); 
+0

이것은 나에게 의미가 있으며 이것은 내가 믿었던 것이지만이 방법으로는 작동하지 않는다. 콜백이 트리거되면 i와 item은 모두 정의되지 않습니다. – Jay

+0

@ 제이 -이 경우에는 코드에 더 많은 변화가 일어나고 있습니다. 이 작업 데모를보십시오 : http://jsfiddle.net/gilly3/czWYK/. – gilly3

+0

알겠습니다. 내 각 블록은 객체 내부의 함수에 포함되어 있으며 콜백을 발행하는 함수는 현재 일반 함수입니다. 그게 문제일까요? 내 실제 코드는 XSS와 다른 많은 노이즈 때문에 의미가 없을 것입니다. 그러나 의미있는 예제를 빠져 나갈 수 있다면 그렇게 할 것입니다. 근본적으로 국가를 지나가는 것으로 작업하고 있지만 추한 것 같습니다. – Jay