2011-03-19 5 views
5

jQuery의 $.getJSON() API를 사용하여 유틸리티 집합에 대해 주어진 URL에서 데이터를 검색하고 있습니다. 나는 각 유틸리티마다 코드를 재사용 할 수있는 방법을 찾고 싶다. 루프가 ajax 호출과 관련없이 실행되기 때문에 루프 값을 유지할 수있는 방법을 찾을 수 없었습니다. 설명을 짜증 그건루프 내 비동기

, 내가 알고, 그것을 정의하는 코드는 here'a 그래서 조금 더 :

그래서 적용 할 수 있습니다 내가 콜백에 입력 한 값을 전달하는 방법을 찾을 필요가
var utility_types = [ 'Electricity', 'Gas', 'Water' ]; 

/** Retrieve known utility providers for the given zip code */ 
for(var i = 0; i < utility_types.length; i++) { 
    var type = utility_types[i]; 

    $.getJSON('/addresses/utilities/' + zip + '/' + type + '.json', null, function(data, status) { 
    alert('Processing ' + type); 
    }); 
} 

올바른 구문. 이것이 없으면 "Water"유틸리티에 대해 3 개의 루프가 모두 실행됩니다. 왜 그것이 이 아니고이 아닌지 알지만 합리적인 해결 방법이 있는지 궁금합니다.

감사합니다.

답변

4

클로저를 만들기

var utility_types = [ 'Electricity', 'Gas', 'Water' ]; 

function getCallBack(type){ 
    return function(data,status){ 
    alert('Processing ' + type); 
    } 
} 

/** Retrieve known utility providers for the given zip code */ 

for(var i = 0; i < utility_types.length; i++) { 
    var type = utility_types[i]; 

    $.getJSON('/addresses/utilities/' + zip + '/' + type + '.json', null, getCallBack(type)); 
} 
3

여전히 익명의 폐쇄를 사용하는 동안이 일을의 표준 방법은 즉시 호출되고있는 다음 루프 변수를 전달되는 새로운 익명의 폐쇄를 만드는 것입니다 반환을 진짜 콜백.

..., success: (function(type) { 
    return function() { 
     alert(type); 
    } 
}(type)) 

외부에서 괄호 안의 type는 루프 :

이 익명의 폐쇄는 예를 들어 외부 루프의 변수를 오버라이드 (override) 할 수 있습니다 (전달 된 매개 변수를 포함하여) 자신의 변수가 포함 된 자신의 범위를 가지고 변하기 쉬운. 함수 선언의 type매개 변수이며 새 종결의 범위에 속합니다. alert이 호출되면 스코프에서 가장 가까운 매개 변수, 즉 매개 변수를 사용합니다.

물론 매개 변수 자체의 변수 이름을 가질 수 있습니다. 외부 범위의 매개 변수와 동일 할 필요는 없습니다. 다른 경우에는 두 가지 모두 사용할 수 있지만 범위를 벗어난 버전은 항상 동일한 값을 갖습니다.

0

각 아약스 요청에 대한 멤버 변수에 '유형'값을 할당하고, 콜백 성공 함수에서 this 키워드를 사용하여 테스트 할 수

var utility_types = [ 'Electricity', 'Gas', 'Water' ]; 

/** Retrieve known utility providers for the given zip code */ 
for(var i = 0; i < utility_types.length; i++) { 
    var type = utility_types[i]; 

    var jsonReq = $.getJSON('/addresses/utilities/' + zip + '/' + type + '.json', null, function(data, status) { 
    alert('Processing ' + this.utilityType); 
    }); 
    jsonReq.utilityType = type; 
} 
관련 문제