2012-06-05 2 views
3

처음으로 $.when을 사용하고 있으며 구문에 어려움이 있습니다.
아래의 간단한 예제와 비슷한 코드가 있습니다. 그것은 작동합니다 (내가 단순화 할 때 오류가 발생하지 않은 경우). 내 문제는 배열에 포함될 많은 요소 인 customerIds을 집에 모르는 것입니다.

var customerIds = new [1, 2, 3]; 

$.when(
    getCustomerData(customerIds[0]), 
    getCustomerData(customerIds[1]), 
    getCustomerData(customerIds[2]) 
).then(function() { 
    alert('success'); 
}).fail(function() { 
    alert('error'); 
}); 

function getCustomerData(int id) { 
    return new $.Deferred(function(defer) { 
        doSomeWork(id, defer); 
    }).promise();  
} 

나는 어려움 구문 권리를 얻는 데 제외한 다음과 같이 $.when 명령문을 작성하고 싶습니다.

function getCustomerDataCalls(customerIds) { 
    var dfds = []; 

    for (var id in customerIds) { 
     dfds.push(new $.Deferred(function(defer) { 
            doSomeWork(id, defer); 
           }).promise());  
    } 

    return dfds; 
} 

불행하게도 뭔가 내 구현에 문제가 있습니다 내가 잘못 가고 어디 해결할 수 없습니다로 getCustomerDataCalls이 구현

$.when(
    getCustomerDataCalls(customerIds), 
).then(function() { 
    alert('success'); 
}).fail(function() { 
    alert('error'); 
}); 

. 내 추측은의 배열을 반환 할 때 뭔가 잘못 가고 있다는 점이다 Deferred

업데이트 :
lanzz 내 인위적인 예를 들어 이미, 나는 doSomeWork

을 포함하는 내 예를 업데이트 이연 반환 한 후 나는 코드를 업데이트
+1

당신은 각각'$의 갔지위한 새로운'Deferred'를 인스턴스화 할 필요가 없습니다()'호출 -'$의 갔지()는'이미 [= 새 당신이 – lanzz

+0

'var에 DFDS를 사용할 수있는 약속을 반환 ];'오타입니다? – fcalderan

+0

@ F.Calderan typo 실제로 수정 해 주셔서 감사합니다. –

답변

15

예, 이것도 발견했습니다 : when 쉽게 배열을 전달할 수 없습니다. 그러나 apply을 사용하여 원하는 결과를 얻을 수 있습니다.

$.when.apply($, getCustomerDataCalls(customerIds)) 
+0

제 생각에는 기본적으로이 동작을 제공해야합니다. 즉, 첫 번째 인수가 배열이고 두 번째 인수가 함수 인 경우 배열의 모든 요소가 완료되면 결과 배열을 사용하여 함수를 호출합니다. 그것이 그렇듯이, 지연 호출이 얼마나 많은지를 미리 안다면 쉽게 쓸 수 있습니다. – podperson

관련 문제