以下是我要做的事情(实际问题不同,但概述如下):
对于上面数组中的每个字母,我有另一个数组:
someArray[alphabet] = [1..100] //another array
对于 someArray [alphabet] 中的每个数字,还有另一个数组:
anotherArray[number] = [a..z,A..Z,1..1000]
假设对于每个字母,我会在 someArray [alphabet]中获取 someArray [alphabet] 以及每个数字 / strong>,我从服务器上获取 anotherArray [数字] - 这需要时间。
此外,获取它们的功能如下 - 我进行 jQuery post 调用以从服务器获取数据。我需要按顺序执行它们。
getAlphabets()
{
//I get them here
//For Each alpha, I call:
getNumbers(alpha);
}
getNumbers(alpha)
{
//I get someArray here.
//For Each element in someArray
//getAnotherArray(element)
}
getAnotherArray(number)
{
//I get them here
//For Each element in anotherArray
//get all [a..z,A..Z,1..1000]
//display them
}
问题是 getNumbers(alpha)的迭代不等待 getAnotherArray(previousIteration)完成。执行(函数调用并行运行(A..Z的同时执行),否则不运行。
我的步骤:
我可以按预期检索所有数据,但不能按顺序检索。
我尝试使用标记和 setInterval,clearInterval 来允许/禁止下一次迭代 - 它们无法按预期工作。
我也尝试使用类似的方法 - getAlphabets()&& getNumbers()& getAnotherArray(),认为这会顺序执行,但我错了。
答案 0 :(得分:0)
当您具有像ajax调用这样的异步操作时,要按顺序迭代某些数据结构,您必须使用不同的迭代形式。您无法使用常规for
循环或while
循环。相反,您可以创建一个用于执行迭代的函数。您可以创建一个状态变量来跟踪迭代中的位置。您启动Ajax调用。返回时,处理结果,然后启动下一个ajax调用(随时更新迭代状态)。
以下是一个例子:
假设你有一个任意长度的数组:
var theData = [...];
并且,您希望对该数组中的每个项目进行ajax调用,并将结果收集到另一个数组中。出于特殊原因,您希望强制Ajax调用是顺序的,以便第二次调用仅在第一次调用完成后进行,依此类推。
function processArray(data) {
var def = $.Deferred();
var currentItem = 0;
var results = [];
function next() {
if (currentItem < data.length) {
$.ajax(...).done(function(result) {
// process the result here
results.push(result);
// advance the counter and start the next Ajax call
++currentItem;
next();
}).fail(function(jqXHR, textStatus, errorThrown) {
def.reject(jqXHR, textStatus, errorThrown);
});
} else {
def.resolve(results);
}
}
next();
return def.promise();
}
// call it like this
processArray(theData).done(function(results) {
// do something with the results array here
});
现在,如果你有三个维度的迭代状态,那么跟踪状态变得有点复杂(你将有三个版本的currentItem来跟踪你在三个维度中的每个维度),但它否则可能是类似的逻辑,当你完成一个维度时,你需要换行到下一行并重新开始。
答案 1 :(得分:-1)
当您使用ajax获取数据时,请求不会以后续方式执行,因为ajax是异步函数。您需要关闭async
。所以,它会按照你想要的顺序运行。
async: false
async(默认值:true)
类型:布尔
默认情况下,所有请求都是异步发送的(默认设置为true)。如果需要同步请求,请将此选项设置为false。跨域请求和dataType:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。
示例:
jQuery.ajax({
url: strUrl,
success: function(html) {
strReturn = html;
},
async:false
});