jQuery.when()语句在ajax调用完成之前过早发生

时间:2013-05-29 17:23:45

标签: javascript jquery

尝试使用jquery和ajax更改我页面上最初打印出的消息:

document.write('<p align="center" id="DataReady">Waiting for server to update the table</p>');
一旦完成所有ajax调用并更新我的数据,

返回其他内容。我的代码的大致如下:

function getData(m) {

    jqs[m] = $.ajax({
        url : WebURL[m],
        type : 'GET',
        dataType: 'jsonp',
        myJ : m
    });
    return jqs[m];
}


function handleData(json_data){

    var j = this.myJ;

    // Inside this function, I manipulate the json_data 
    // object and store it into other variables
}   

$(document).ready(function() { 

    for (var i=0; i<5; i++){
        getData(i).done(handleData); 
    }

    $.when(jqs).done(function(){
        document.getElementById("DataReady").innerHTML = "Up to date!"
    });
});

当文档准备就绪时,我基本上循环遍历我的getData函数并使用延迟对象执行ajax调用,并且当完成每个相应的ajax调用时,handleData函数获取json数据(特定于每个相应的ajax调用)和操纵它以供进一步使用。

但是,一旦我遍历所有ajax调用(存储在jqs数组中),我似乎无法使最后一部分正常工作:我的$.when语句。我查看了jquery API(http://api.jquery.com/jQuery.when/),似乎无法看到我做错了什么。

我希望在最后一个语句中发生的是当所有ajax调用都被生成(存储在数组jqs中)时,初始消息将更改为“最新!”,但不会更快。现在看来,消息正在变为“最新!”即使ajax调用没有完成。更令人不安的是,如果删除行getData(i).done(handleData);,即使没有发生ajax调用,消息仍然会被更改。有没有人知道如何解决这个问题?非常感谢任何建设性的帮助。感谢。

1 个答案:

答案 0 :(得分:4)

$.when()不接受数组 当你传递一个数组时(即使它是一个promises数组),jQuery会将它视为一个已解析的值。

要传递多个承诺,您需要调用.apply将每个承诺作为单独的参数传递:

$.when.apply($, jqs).done(...);