Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery延迟对象,按顺序调用函数_Javascript_Jquery_Deferred_Promise - Fatal编程技术网

Javascript jQuery延迟对象,按顺序调用函数

Javascript jQuery延迟对象,按顺序调用函数,javascript,jquery,deferred,promise,Javascript,Jquery,Deferred,Promise,我对如何使用jQuery的延迟对象感到困惑,我所看到的示例对我没有帮助。我想做的是1.)通过ajax调用获取日历对象,2.)用日历数据填充全局对象(MYOBJ)的一部分,然后3.)用MYOBJ中的新数据填充页面元素。这三个函数实现了逻辑,我想按顺序调用它们: function getCalendar(refDate, numDays) { return $.ajax({ type: "POST", url: "services/Calendar.asmx/

我对如何使用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和Brian ONeil正确指出的那样,我可以在loadCalendarData的末尾继续调用populateCalendar。那肯定会有用的。我希望我在发帖时就想到了这一点。我想我的最终目标是找出如何实现排序。不过,在这种情况下,我想不出有哪种情况会在调用loadCalendarData后不直接调用populateCalendar,所以这个解决方案绝对有意义。谢谢。

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

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

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

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

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

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

你能不能把populateCalendar称为loadCalendarData的最后一行?那肯定有用,谢谢。不过,我很抱歉,我忘了提到我正在努力使这些函数尽可能相互独立。我给出的示例来自页面加载,但可以想象,在加载之后也可以调用这两个函数。我主要是想把注意力集中在延迟上,这是一个我不知道怎么做的例子。你能不能把populateCalendar称为loadCalendarData的最后一行?那肯定会有用的,谢谢。不过,我很抱歉,我忘了提到我正在努力使这些函数尽可能相互独立。我给出的示例来自页面加载,但可以想象,在加载之后也可以调用这两个函数。我主要是想把注意力集中在延期上,这是一个我不知道怎么做的例子。谢谢,不过我不确定我是否理解这一点。直接传递函数和在anon函数中执行函数之间有什么区别?当您调用它执行的函数时,它的返回值将用作回调函数,其中当您传递函数引用时,它将用作回调函数,并将在稍后阶段执行。谢谢,不过,我不确定我是否理解这一点。直接传递函数和在anon函数中执行函数之间有什么区别?当您调用它执行的函数时,它的返回值将用作回调函数,而当您传递函数引用时,它将用作回调函数,并将在稍后的阶段执行。