我不是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完成后才再次调用它,我认为这样的事情会起作用,但我最终会陷入无限循环。任何建议将不胜感激
答案 0 :(得分:0)
忽略不必要的回调(如果calcRoute本身在某种程度上是异步的,你只需要回调),无限循环是由条件中的next = false引起的。发生的事情是:
如果你摆脱整个“下一个”布尔部分,这个函数将做你想要的,并消除回调。因为它不是异步的,所以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架构而不是显式回调函数,具体取决于您可以使用的异步函数的选项'正在使用。