2012-02-20 6 views
1

jQuery의 Deferred 객체를 사용하는 방법에 대해 혼란 스럽습니다. 내가하고 싶은 일은 1.) ajax 호출을 통해 달력 객체를 얻는다. 2.) 내 전역 객체 (MYOBJ)의 일부를 달력 데이터로 채운 다음, 3. MYOBJ의 새로운 데이터로 페이지 요소를 채운다. . 이 세 가지 기능은 로직을 구현하고, 나는 순서를 호출 할 :jQuery 지연된 객체, 순서대로 함수 호출

function getCalendar(refDate, numDays) { 
    return $.ajax({ 
     type: "POST", 
     url: "services/Calendar.asmx/GetCalendar", 
     data: '{ "refDate": "' + refDate + '", "numDays": "' + numDays + '" }', 
     contentType: "application/json; charset=utf-8", 
     dataType: "json" 
    }).promise(); 
} 


function loadCalendarData(response) { 
    var calData = jQuery.parseJSON(response.d); 
    MYOBJ.cal.dMin = calData.dMin; 
    MYOBJ.cal.dMax = calData.dMax; 
    MYOBJ.cal.dates = calData.dates; // array of date strings 
} 


function populateCalendar (x, y, z) { 
    // use data from MYOBJ.cal here 
} 

그래도 이루어집니다() loadCalendarData 때까지 기다립니다) (populateCalendar를 만드는 방법을 알아낼 수 없습니다. 이 ...

$.when(getCalendar(myDate, 70)) 
.then(loadCalendarData) 
.then(populateCalendar(a, b, c)) 
.fail(alertCalendarError); 

은 ... 분명 잘못된 것입니다 - 그것은 내가 뭘하는지 이해하지 않기 때문에 나는 벽에 던져 한 단 하나의 변화입니다 ... :)

업데이트 : GoldenNewby와 Brian ONeil이 올바르게 지적 했으므로 loadCalendarData 끝에 populateCalendar에 대한 호출을 할 수 있습니다. 그것은 확실히 작동 할 것입니다. 제가 게시 할 때 그 생각을했으면 좋겠습니다. 내 궁극적 인 목적은 시퀀싱을 달성하는 방법을 파악하는 것이 었습니다. 그러나이 경우에는 loadCalendarData가 populateCalendar를 호출하지 않고 호출되는 시나리오를 생각할 수 없으므로이 솔루션은 분명히 의미가 있습니다. 감사.

+1

loadCalendarData의 마지막 행으로 populateCalendar를 호출 할 수 없습니까? – GoldenNewby

+0

그건 분명히 작동합니다, 고마워요. 미안하지만, 나는 가능한 한 서로의 기능을 독립적으로 유지하려고 노력하고 있다고 언급하는 것을 잊어 버렸다. 내가 준 예제는 페이지로드에서 나온 것입니다.하지만 그 중 하나의 함수가 호출 될 수 있습니다. 주로 나는 연기 된 것들에 대해 머리를 감싸려고 노력하고 있는데, 이것은 어떻게해야 하는지를 알 수없는 무언가의 예입니다. –

답변

4

당신은 실제로 populateCalendar(a, b, c)을 실행하고 있습니다. 함수 참조를 전달해야합니다. 이 시도.

$.when(getCalendar(myDate, 70)) 
.then(loadCalendarData) 
.then(function(){ 
    populateCalendar(a, b, c) 
    }) 
.fail(alertCalendarError); 
+0

고마워, 나는 이것을 이해할 지 모르겠다. 함수를 직접 전달하고 anon 함수 내에서 실행하는 것의 차이점은 무엇입니까? –

+0

함수를 호출하면 함수가 실행되고 반환 값은 콜백으로 사용됩니다. 함수 참조를 전달할 때 콜백 함수로 사용되며 이후 단계에서 실행됩니다. – ShankarSangoli

+0

물론 아하, 고마워요! 나는이 사이트를 좋아한다. –

1

지연된 방식으로 호출해야하는 유일한 방법 인 것처럼 보입니다 (loadCalendarData).

당신이 만들고있는 .ajax 호출의 성공 콜백에서 loadCalendarData를 호출하면 loadCalendarData의 끝에 populateCalendar를 호출 할 수 있습니다 (이미 주석에 언급 된대로). 그것은 다음과 같이 보일 것이다

...

function getCalendar(refDate, numDays) { 
    return $.ajax({ 
     type: "POST", 
     url: "services/Calendar.asmx/GetCalendar", 
     data: '{ "refDate": "' + refDate + '", "numDays": "' + numDays + '" }', 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: loadCalendarData 
    }); 
} 


function loadCalendarData(response) { 
    var calData = jQuery.parseJSON(response.d); 
    MYOBJ.cal.dMin = calData.dMin; 
    MYOBJ.cal.dMax = calData.dMax; 
    MYOBJ.cal.dates = calData.dates; // array of date strings 

    populateCalendar(a, b, c); //not called until MYOBJ is setup 
} 


function populateCalendar (x, y, z) { 
    // use data from MYOBJ.cal here 
}