等待一系列Ajax请求完成

时间:2015-04-28 09:17:39

标签: javascript jquery ajax

我有一个带有文件名的数组,我需要使用ajax请求检索所有这些文件并等待它们完成初始化我的模板。

$.when(req[0],req[1],req[2],req[3],req[4],req[5],req[6],req[7]).done(function(){
    for (var i in arr) 
        Stencil.push(new Platform(importedData[i].cells[0]));                             

    $(".se-pre-con").fadeOut("slow");;
})

你可以看到我修正了等待请求的号码,这没有用。我怎么能动态地等待所有的请求,请求的数量是我的数组的长度。

2 个答案:

答案 0 :(得分:2)

您可以将when应用于这样的数组:

$.when.apply($, req).done(function(){

    for (var i in arr) 
       Stencil.push(new Platform(importedData[i].cells[0]));                             
    $(".se-pre-con").fadeOut("slow");

});

数组必须用jQuery promises填充,所以最好使用处理一个文件的函数的结果并返回一个promise并将它们存储在数组中。

如果您可以提供有关您对文件执行操作的详细信息,我将更新示例以匹配。

这是一个模拟asyc文件处理的小样本(使用计时器):

JSFiddle: http://jsfiddle.net/TrueBlueAussie/79bp8yw1/

var files = ["file1", "file2", "file3", "file4"];

var req = [];
for (var i = 0; i < files.length; i++){
    req.push(processFile(files[i]));
}

$.when.apply($, req).done(function(){
    $('#body').append("All done");
});

并且虚拟文件处理函数返回一个promise:

var time = 1000;
function processFile(filename){
    var def = $.Deferred();
    setTimeout( function(){
        $('body').append("File " + filename + "<br/>");
        def.resolve();
    }, time);
    time += 1000;
    return def.promise();
}

答案 1 :(得分:0)

您可以使用从这些AJAX调用返回的所有promise来填充数组,然后将其应用于$.when。试试这个:

$.when.apply($, req).done(function() {
    // your logic here...
});