【问题标题】:wait for an array of Ajax Requests to be done等待一组 Ajax 请求完成
【发布时间】:2015-04-28 17:31:47
【问题描述】:

我有一个包含文件名的数组,我需要使用 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");;
})

如您所见,我修复了要等待的请求的数量,但这并不好。我如何动态等待所有这些请求,请求的数量是我的数组的长度。

【问题讨论】:

    标签: javascript jquery ajax


    【解决方案1】:

    您可以将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 Promise 填充,因此最好使用处理一个文件并返回 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();
    }
    

    【讨论】:

    • 谢谢! $.when.apply 为我工作!至于你的第二个答案,我不太明白,我正在尝试使用 AJAX 请求检索 JSON 数据(它代表我的模具中的一个对象,每个对象),我需要等待所有这些 ajax 请求完成将它们推到我的 Stencil 中。所以我不明白为什么你需要设置一个计时器。您修复了 ajax 请求完成的超时?
    【解决方案2】:

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

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

    【讨论】:

    • 你的答案也是正确的,它对我有用,但我选择 trueblueaussie 作为答案,因为它更详细。谢谢
    • 没问题,很乐意提供帮助。
    猜你喜欢
    • 2018-08-20
    • 2014-02-19
    • 2013-03-27
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    相关资源
    最近更新 更多