while循环中的jquery回调不起作用

时间:2017-03-03 16:59:56

标签: jquery callback

我不是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完成后才再次调用它,我认为这样的事情会起作用,但我最终会陷入无限循环。任何建议将不胜感激

1 个答案:

答案 0 :(得分:0)

忽略不必要的回调(如果calcRoute本身在某种程度上是异步的,你只需要回调),无限循环是由条件中的next = false引起的。发生的事情是:

  1. 接下来是真的,继续调用函数。
  2. 计数递增。
  3. 下一步设为false。
  4. 循环被检查 - count仍然不等于data.length,但是next是false,所以它只是继续循环。计数永远不会递增,所以它永远不会退出,而next永远不会设置为true,所以它永远不会再次尝试该函数。
  5. 如果你摆脱整个“下一个”布尔部分,这个函数将做你想要的,并消除回调。因为它不是异步的,所以calcRoute函数 - 即使在响应ajax查询时被调用 - 将在它调用count ++之前完全执行并移动到循环中的下一步。尝试类似:

    while(count != data.length)
    {
        calcRoute(directionsService, data, count);
        count++;                            
    }
    function calcRoute(service, data, count)
    {
         .....
    }
    

    这将消除由布尔检查引起的无限循环,并且在递增计数和循环之前,它将为每个条目完成calcRoute。

    添加回复以下评论

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

    要解决此问题,您需要让async函数触发回调而不是calcRoute,或者切换到使用promise架构而不是显式回调函数,具体取决于您可以使用的异步函数的选项'正在使用。