我正在开发一个涉及循环数组的站点,对每个元素使用jQuery ajax调用。这是一个简化版本:
var myArray=new Array("El1","El2","El3","El4");
for(var i=0; i<myArray.length; i++){
$.ajax({
url: 'page.php?param='+myArray[i],
success: function(data){
//doing stuff with the data
//this needs to complete before the loop advances
}
});
}
我需要在完成循环之前完成每个调用。我尝试设置async:false
,这使得循环正常工作,但这会占用页面的其余部分脚本并导致很多滞后。有什么方法可以防止循环推进直到调用完成,但仍然能够异步运行其他脚本?
答案 0 :(得分:6)
var idx = 0;
var urls = ["El1","El2","El3","El4"];
var doNextRequest = function() {
$.ajax({
url: 'page.php?param=' + urls[idx],
success: function(data) {
// ...
idx++;
if (idx < urls.length) {
doNextRequest();
}
}
});
}
doNextRequest();
答案 1 :(得分:3)
如果您使用Array.shift
:
var myArray = new Array("El1", "El2", "El3", "El4");
function doRequest() {
if (!myArray.length) return;
var current = myArray.shift();
$.ajax({
url: 'page.php?param=' + current,
success: function(data) {
//doing stuff with the data
doRequest();
}
});
}
答案 2 :(得分:1)
在前一个成功处理程序中调用下一个请求。像这样的东西。 (可能是一个更优雅的结构)。
var myArray=new Array("El1","El2","El3","El4");
var i = 0;
function callAjax()
{
$.ajax({
url: 'page.php?param='+myArray[i],
success: function(data){
//doing stuff with the data
//this needs to complete before the loop advances
if (i < myArray.length)
{
i++;
callAjax();
}
}
});
}