2015-04-28 125 views
2

我有一個包含文件名的數組,我需要用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");; 
}) 

正如你所看到的,我固定了要等待的請求的數量,這是不好的。我如何動態地等待所有thoses請求,請求的數量是我的數組的長度。

回答

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的承諾,所以最好使用能夠處理一個文件,並返回一個承諾和存儲功能的結果陣列中的那些人。

如果您可以提供有關您對文件做什麼的更多信息,我會更新示例以匹配。

這裏是模擬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"); 
}); 

和虛擬文件處理函數返回一個承諾:

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

謝謝! $ .when.apply爲我工作! 至於你的第二個答案,我不完全得到它,我試圖用AJAX請求(它代表我的模具中的一個對象,每個人)檢索JSON數據,我需要等待所有這些ajax請求完成推動他們在我的模具。 所以我不明白爲什麼你需要設置一個計時器。您修復了ajax請求的超時時間? – azelix

0

你可以用一個數組填充返回的所有promise從這些AJAX調用開始,然後將其應用於$.when。試試這個:

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

你的答案也是正確的,但它對我有用,但我選擇trueblueaussie作爲答案,因爲它更精細。謝謝 – azelix

+0

沒問題,很樂意幫忙。 –