Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 使用AJAX查询执行While或For循环_Jquery_Ajax - Fatal编程技术网

Jquery 使用AJAX查询执行While或For循环

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;

我试图用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;
        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次,我就会返回