Javascript 转到下一次迭代$。如果ajax已经完成,每个迭代都是吗?

Javascript 转到下一次迭代$。如果ajax已经完成,每个迭代都是吗?,javascript,ajax,jquery,each,Javascript,Ajax,Jquery,Each,查看下面的代码,它似乎执行了许多$。post无需等待数据==“1” 如果数据等于1,则应进行下一次迭代($。每个) 怎样才能做到呢 $.each(data, function(index) { $.post("tracking.php", { action: "send", id: getId }, function(data) { if (data == "1") { // } },'json'); }); 您可以使用数组data的第一个索引调用第一个p

查看下面的代码,它似乎执行了许多
$。post
无需等待
数据==“1”

如果
数据
等于
1
,则应进行下一次迭代(
$。每个

怎样才能做到呢

$.each(data, function(index) {
  $.post("tracking.php",  { action: "send", id: getId }, function(data) {
    if (data == "1") {
      //
    }
  },'json');
});

您可以使用数组
data
的第一个索引调用第一个
post
请求,然后等待
response(data)
返回,然后在下一个索引上触发另一个
post
请求,依此类推:

function posts(index) {
  $.post("tracking.php",  { action: "send", id: getId }, function(response) {
    if (response == "1") {
       index++;
       if (index < data.length) post(index); //call the function "post" again only if index is lower than the array "data" length.
       }
    }
  },'json');
});
posts(0);
职能岗位(索引){
$.post(“tracking.php”,{action:“send”,id:getId},函数(response){
如果(响应=“1”){
索引++;
if(index
由于
$.post
是异步的,因此不能使用它来控制循环。您可以使用如下结构:

var data = [1, 2, 3];

function iterator(arr) {
    function iterate(i) {
        // Use `arr[i]`
        $.post("tracking.php",  { action: "send", id: getId }, function(data) {
            if (data == "1") {
                iterate(++i);
            }
        }, "json");
    }
    iterate(0);
}

iterator(data);
演示:

当然,在演示中,我必须修改代码/参数以使其与JSFIDLE一起工作。请注意,在响应不是
“1”
(这只是数组中的值,因为我需要只回显该值以显示其工作方式)之后,它是如何停止的。您可以查看浏览器的控制台以了解发生了什么

更新:

为了确保不超过数组的边界,需要检查其长度。以下是最新消息:

function iterator(arr) {
    // You can use `arr` anywhere inside of `iterator`
    function iterate(i) {
        // You can use `i` anywhere inside of `iterate`
        if (i < arr.length) {
            $.post("tracking.php",  { action: "send", id: getId }, function(data) {
                if (data == "1") {
                    iterate(++i);
                }
            }, "json");
        }
    }
    iterate(0);
}
函数迭代器(arr){
//您可以在迭代器中的任何位置使用'arr'`
函数迭代(i){
//您可以在iterate中的任意位置使用'i'`
如果(i
使用$。每个异步请求都不能控制循环的执行,但是,使用for循环可以:

for(var index in data){
    data = 0;
    $.ajax({
        url:"tracking.php",  
        data: { action: "send", id: getId }, 
        type: 'POST',
        async: false,
        success: function(tmpData){
          data = tmpData
        }
    });
    if(data != '1'){
        break;
    }
}

在本例中,我们使用for循环和jQuery sync ajax请求从服务器获取结果,并验证该值是否符合预期。如果返回与“1”不同的内容,我们只需中断(停止)循环

这就是所谓的“异步”。你将无法使用
$。each()
以这种方式循环。我不明白为什么我会被否决。
$。ajax()
会让一切变得不同和简单吗?@我不会回来,至少在你的情况下不会回来-这只是
$。ajax()
设置了特定内容的快捷方式。我喜欢在任何情况下都使用
$.ajax()
,因为我喜欢显式(并且您可以为
$.ajax()
调用设置任何选项,而不是
$.post()
允许的特定选项),但是如果您喜欢使用
$.post
,我看不出它对您有帮助/伤害。谢谢。在执行
迭代(++i)之前,是否有方法使用check
arr.length
?可能
如果(arr.length!=i){iterate(++i);}
?@我会回来的我刚刚用我所用的更新了我的答案。我宁愿把它放在
$.post
回调之外。特别是,如果出于某种原因,
arr
最初没有任何项目,因此长度为
0
,您肯定应该添加一些解释。这将提高回答问题的质量,以供将来的访问者使用
index
没有意义。@我将返回
index
将检查索引是否到达数组中的最后一个子节点
data
请参见上面的解释以了解更多详细信息
data
是来自ajax数据的变量-它不是数组。这-->
$。每个(数据、函数(索引){
表示数据是一个数组,在回答中,您接受的数据被声明为数组-->
var data=[1,2,3];
,那么它是一个变量是什么意思呢?