循环中的jquery回调不起作用

循环中的jquery回调不起作用,jquery,callback,Jquery,Callback,我不是jquery专家,但我认为下面的方法可以奏效 var next = true; while(count != data.length) { if(next == true) { calcRoute(directionsService, data, count, function(){next = true;}); count++; next=false;

我不是jquery专家,但我认为下面的方法可以奏效

var next = true;
while(count != data.length)
{
    if(next == true)
    {                   
        calcRoute(directionsService, data, count, function(){next = true;});
        count++;
        next=false;                 
    }                               
}
function calcRoute(service, data, count, callback)
{
     .....
     callback();
}

因此,我需要等到calcRoute完成后再调用它,我认为这样做会起作用,但我最终进入了一个无限循环。如果忽略不必要的回调(如果calcRoute本身是异步的,您只需要回调),无限循环是由条件中的next=false引起的,我们将非常感谢任何建议。正在发生的是:

  • 下一步为true,继续调用函数
  • 计数递增
  • Next设置为false
  • 循环被检查——count仍然不等于data.length,但next为false,所以它只是继续循环。计数从不递增,因此它永远不会退出,next永远不会设置为true,因此它永远不会再次尝试该函数
  • 如果去掉整个“next”布尔部分并消除回调,则此函数将执行您想要的操作。因为它不是异步的,calcRoute函数——即使是在响应ajax查询时调用的——将在调用count++并进入循环的下一步之前完全执行。尝试以下方法:

    while(count != data.length)
    {
        calcRoute(directionsService, data, count);
        count++;                            
    }
    function calcRoute(service, data, count)
    {
         .....
    }
    
    这将消除由布尔检查引起的无限循环,并在递增计数和循环之前完成每个条目的计算

    对以下评论作出回应的新增内容

    即使函数calcRoute本身调用异步函数,也不会使calcRoute本身异步。calcRoute可以,也将在其中的异步函数返回响应之前完成并退出——这仍然意味着它将完成并返回其标志,然后其余代码将以线性方式执行。next=true函数仍将在线性代码中设置的next=false之前执行,并且您仍将以无限循环结束


    要解决这个问题,您需要让异步函数触发回调而不是calcRoute,或者切换到使用承诺体系结构而不是显式回调函数,这取决于您正在使用的异步函数的可用选项。

    检查
    回调()中的任何循环引用
    calcRoute()
    您使用的是延期付款吗?
    calcRoute()
    函数中的任何内容都是异步的吗?从你所展示的代码来看,回调并不存在,因此回调是没有意义的。在回调中尝试promise方法。上面的while循环在ajax响应中,所有过程都是从该响应中执行的,calcRoute与此非常相似。谢谢你的回答,但calcRoute是异步的,它调用google direction api,您可以在问题注释中看到我的函数的类似版本,由于Google api的限制,我必须确保一个接一个地调用此函数,以减少达到限制的可能性。按您的方式执行会立即达到限制calcRoute函数本身不是异步的,但是--如果它在函数中调用异步的东西(这里没有发布,所以我们看不到),那么需要触发回调事件的是被调用的异步函数,而不是calcRoute本身,因为calcRoute可以在它内部的异步函数完成之前退出。啊,我明白了,谢谢,我会看一看,这是否意味着我可以通过多个函数传递回调函数?如果你调用的函数支持它,你可以。