我怎么知道上次异步完成的时间?

Phi*_*enn 7 javascript jquery asynchronous

我有这样的事情:

for (var i=0;i<result.qry.ROWCOUNT;i++) {
  myAsync(i);
}
Run Code Online (Sandbox Code Playgroud)

我怎么知道我的所有异步函数何时完成执行?

冒着有人回复"需要更多jQuery!"的风险,我可以使用jQuery promise对象吗?或推迟或类似的东西?

Phr*_*ogz 9

跟踪未完成的异步调用次数.当每个完成时,减少你的计数器.当你到0时,你处于最后一个回调中.

var asyncsLeft = 0;
for (var i=0;i<10;++i){
   asyncsLeft++;
   doSomethingAsyncWithCallback(function(){
     // This should be called when each asynchronous item is complete
     if (--asyncsLeft==0){
       // This is the last one!
     }
   });
}
Run Code Online (Sandbox Code Playgroud)

由于JavaScript的单线程特性,没有潜在的竞争条件,您可能会在所有异步调用排队之前调用回调.如果你愿意,可以安全地asyncsLeft++拨打电话doSomethingAsynchronous.

  • 我建议使用类似的方法:使用两个变量,一个用于计算资源的总数,另一个用于跟踪已加载/失败的资源的数量(可能在其他两个变量中)。使用一个变量,您冒着一个风险,即在代码生成新请求之前,请求完成的机会很小,这将过早地假定所有内容都已加载(是的,这实际上已经发生在我身上)。另外,使用两个变量可以显示加载资源的进度。 (2认同)

Mic*_*win 1

在 jQuery 中,有一个$.ajaxStop函数在最后一个 Ajax 运行后运行。