jQuery Отложенный объект, вызывающий функции в последовательности - PullRequest
1 голос
/ 21 февраля 2012

Я не совсем понимаю, как использовать отложенный объект jQuery, и примеры, которые я видел, мне не помогают. Что я хочу сделать: 1.) получить объект календаря с помощью вызова ajax, 2.) заполнить часть моего глобального объекта (MYOBJ) данными календаря, а затем 3.) заполнить элемент страницы новыми данными в MYOBJ , Эти три функции реализуют логику, и я хочу вызвать их последовательно:

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 и Брайан ONeil, я мог бы просто прикрепить мой вызов к populateCalendar в конце loadCalendarData. Это определенно сработает. Хотелось бы, чтобы я думал об этом во время публикации. Я предполагаю, что моей конечной целью было выяснить, как добиться последовательности. В этом случае, однако, я не могу придумать ни одного сценария, где loadCalendarData будет вызываться без вызова populateCalendar непосредственно после него, поэтому это решение определенно имеет смысл. Спасибо.

Ответы [ 2 ]

4 голосов
/ 21 февраля 2012

Вы фактически выполняете populateCalendar(a, b, c). Вы должны передать ссылку на функцию. Попробуйте это.

$.when(getCalendar(myDate, 70))
 .then(loadCalendarData)
 .then(function(){
     populateCalendar(a, b, c)
  })
 .fail(alertCalendarError);
1 голос
/ 21 февраля 2012

Кажется, что единственный метод, который должен вызываться отложенным способом, - это 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
}
...