Jquery 使用AJAX查询执行While或For循环
我试图用while或for循环控制ajax查询。我的目的是让循环执行4次,并用相同的查询填充4个值。我的问题是,当然,AJAX请求是异步的,可能需要时间。因此,我要么使用冻结的浏览器,要么在分配值之前完成循环Jquery 使用AJAX查询执行While或For循环,jquery,ajax,Jquery,Ajax,我试图用while或for循环控制ajax查询。我的目的是让循环执行4次,并用相同的查询填充4个值。我的问题是,当然,AJAX请求是异步的,可能需要时间。因此,我要么使用冻结的浏览器,要么在分配值之前完成循环 var i = 0; while (i < 4) { doAjaxReq().done(function (result) { if (i == 0) val1 = result; else if (i == 1) val2 = result;
var i = 0;
while (i < 4) {
doAjaxReq().done(function (result) {
if (i == 0) val1 = result;
else if (i == 1) val2 = result;
else if (i == 2) val3 = result;
else if (i == 3) val4 = result;
});
}
如果我将I++放在ajax请求之外,它当然会在完成所有请求之前完成循环。如果我将I++放在ajax.done中,我将使浏览器崩溃
我能做什么?试试:
function request(i){
if(i> 3) return;
doAjaxReq().done(function (result) {
if (i == 0) val1 = result;
else if (i == 1) val2 = result;
else if (i == 2) val3 = result;
else if (i == 3) val4 = result;
request(i+1);
});
}
//somewhere
request(0);
尝试将结果放入一个n数组中,如
var i = 0;
var ajaxRes=[];
while (i < 4) {
doAjaxReq().done(function (result) {
ajaxRes.push(result);
});
i++
}
我不知道这是否是最好的解决方案,但我想不出更简单的办法
var i = 0;
var results = [];
function xx(){
if(i >= 4){
return;
} else {
doAjaxReq().done(function (result) {
//avoid if and elseif
results[i] = result;
i++;
xx();
});
}
}
}
.done处理程序将在稍后调用。这意味着您的for或while循环将完全完成,我将处于它的终值。所以,你要么找到一个不同的结构,要么把i放入一个闭包中,这样它的值就被保留了。该做什么取决于您是否真的希望并行或按顺序运行ajax调用
如果parallel可以同时执行所有ajax调用,那么您有以下选项:
for (var i = 0; i < 4; i++) {
// create closure to capture the value of `i`
(function(index) {
doAjaxReq().done(function (result) {
if (index == 0) val1 = result;
else if (index == 1) val2 = result;
else if (index == 2) val3 = result;
else if (index == 3) val4 = result;
});
})(i);
}
或者,它可能使编码更容易将结果放入数组中,并使用承诺函数来知道何时完成了所有操作:
var promises = [];
for (var i = 0; i < 4;i++) {
promises.push(doAjaxReq());
}
$.when.apply($, promises).done(function(r1, r2, r3, r4) {
// all ajax calls are done here and
// results are in r1[0], r2[0], r3[0], r4[0]
});
如果您试图对ajax调用逐个排序,请等待一个调用完成后再启动下一个调用,则可以使用以下结构:
var cntr = 0;
var results = [];
function next() {
doAjaxDone().done(function(data) {
++cntr;
results.push(data);
if (cntr < 4) {
next();
} else {
// all ajax calls done here and results are in results array
}
})
}
为什么不使用数组来放置结果呢?我不知道会有什么不同。。我仍然需要4个ajax调用。你能试试递归吗?你永远不会增加I-这会永远运行吗?有一个更好的方法来剥猫皮。您可以向ajax调用传递一个上下文,在回调中给出这个上下文,例如this=val1或this=val2。此外,可能还想查看API。从不增加i并同时运行所有调用,从而混合i的所有值。现在,它将所有结果放入结果[3]。也没有调用xx来开始工作。@jfriend00忘记添加递增,而不是对函数的初始调用,我只提供了递归函数。我不理解混合值的部分,我认为op试图将每个响应存储在一个单独的变量中。这是可行的,将所有值放在数组的单独索引中,这是因为您的JSFIDLE不是异步的,这是这里的挑战。.done处理程序将在所有xx函数调用都被调用后的某个时间被调用。这意味着当调用所有.done处理程序时,我的值将为3。这就是异步响应的全部问题。如果您将i++和xx移动到.done处理程序中,那么它可能会工作。哦,好的,这就是问题所在。我会改变的。感谢you@dave-你说得对-我已经纠正了。这样的疏忽导致它不能直接支持数组,因为这是最常见的用法。我只是简单地使用递归,如果我点击它4次,我就会返回