繁体   English   中英

jQuery Deferred对象,按顺序调用函数

[英]jQuery Deferred object, calling functions in sequence

我对如何使用jQuery的Deferred对象感到困惑,而我所看到的示例并没有帮助我。 我想做的是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和Brian ONeil正确指出的那样,我可以在loadCalendarData的结尾处保留对populateCalendar的调用。 那肯定会工作。 我希望我在发布时已经想到了这一点。 我想我的最终目标是弄清楚如何实现排序。 但是,在这种情况下,我无法想到在没有直接调用loadCalendarData之后再不直接调用populateCalendar的任何情况,因此这种解决方案绝对有意义。 谢谢。

您实际上正在执行populateCalendar(a, b, c) 您必须传递函数引用。 尝试这个。

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

似乎唯一需要以延迟方式调用的方法是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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM