2012-02-20 5 views
1

Я смущен тем, как использовать объект отложенного jQuery, и примеры, которые я видел, не помогают мне. Я хочу сделать: 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 
} 

Я не могу понять, как сделать populateCalendar() ждать, пока loadCalendarData() не будет сделано, хотя. Это ...

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

..., очевидно, неправильно - это просто один из вариантов я бросил к стене, потому что я не понимаю, что я делаю ... :)

ОБНОВЛЕНИЕ: Как правильно указывать GoldenNewby и Brian ONeil, я мог бы просто использовать мой вызов для заполнения календаря в конце loadCalendarData. Это определенно сработает. Хотелось бы, чтобы я подумал об этом, когда отправлял. Я предполагаю, что моя конечная цель состояла в том, чтобы выяснить, как добиться последовательности. В этом случае, однако, я не могу представить ни одного сценария, в котором loadCalendarData будет вызываться без вызова populateCalendar непосредственно после него, поэтому это решение имеет смысл. Благодарю.

+1

Можете ли вы не просто вызвать populateCalendar как последнюю строку loadCalendarData? – 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.

Я бы назвал loadCalendarData из обратного вызова успешного вызова .ajax, который вы делаете, а затем вы можете просто вызвать populateCalendar в конце loadCalendarData (как уже упоминалось в комментариях).

это будет выглядеть примерно так ...

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 
}