我怎么知道最后一次异步是什么时候完成的
How do I know when the last async is done?
我有这样的东西:
for (var i=0;i<result.qry.ROWCOUNT;i++) {
myAsync(i);
}
我如何知道我的所有异步函数何时完成执行?
冒着有人回复"需要更多jQuery!"的风险,我可以使用jQuery promise对象吗?或者延期或者类似的事情?
跟踪有多少异步调用未完成。每次完成后,递减计数器。当您到达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!
}
});
}
由于JavaScript的单线程特性,在所有异步调用排队之前,不存在可能调用回调的潜在竞争条件。如果您愿意,将asyncsLeft++
调用放在doSomethingAsynchronous
之后是安全的
我会这样做:
//Do stuff up here to get records
var rowCount = result.qry.ROWCOUNT, //Save the row count
asyncCount = 0, //The count of complete async calls
asyncCallback = function() {
//To be called whenever an async operation finishes
asyncCount++; //Increment the row counter
if (asyncCount >= rowCount) {
//Do stuff when they're all finished
}
};
for (var i=0;i<rowCount;i++) {
myAsync(i, asyncCallback);
}
function myAsync(index, completeCallback) {
//Do async stuff with index
//Call completeCallback when async stuff has finished or pass it
// into the async function to be called
}
在jQuery中,有一个$.ajaxStop
函数在最后一个Ajax运行之后运行。
如果使用jQuery,还可以使用ajaxSend
和ajaxComplete
方法将计数器代码与调度代码分开。
var ajaxPending = 0;
function ajax_changed(indicator, pending) {
if (pending)
$(indicator).show();
else
$(indicator).hide();
}
$('#loading-indicator').ajaxSend(function() {
ajax_changed(this, ++ajaxPending);
});
$('#loading-indicator').ajaxComplete(function() {
ajax_changed(this, --ajaxPending);
});
使用回调函数:
for (var i=0;i<result.qry.ROWCOUNT;i++) {
myAsync(i, myCallback);
}
function myCallback(i){
//set result.qry.ROWCOUNT to a var somewhere above if it's not available in this scope
if(i == (result.qry.ROWCOUNT - 1)){
//now you know you're actually done with all requests
}
}
function myAsync(i,callback){
///do work
callback(i);
}
相关文章:
- Javascript匹配以从URL中删除部分文件名-替换最后一次出现的内容
- 正在查找最后一次出现的文本
- JavaScript只有在最后一次被调用时才运行函数
- 字符串拆分并获取第一次和最后一次出现
- Regex-从第二次出现到最后一次出现
- 我如何可以忽略以前的选择,只写最后一次选择
- 异步mongodb更新循环中最后一次迭代后的重定向
- 链接超时会导致最后一次超时被拒绝
- 变量在循环的最后一次迭代中变为未定义
- 将匹配字符串中最后一次出现的点的正则表达式
- 删除/隐藏链接后最后一次出现的字符串
- 如何获取单击元素的类值,并使用此值在 jquery 中最后一次出现此类之后放置一段 html 代码
- 如何在最后一次出现某个字符后获取 url 中的参数
- 在使用 CasperJS 遍历参数化 URL 时,仅执行最后一次迭代
- HTML/JQuery:按钮在根本不应该提交的时候提交一次
- 在javascript中获取除最后一次外的所有模式
- 使用lookahead获取javascript中模式的最后一次出现
- 删除javascript中最后一次出现的字符串
- Javascript Regex匹配字符串最后一次出现后的所有内容
- 我怎么知道最后一次异步是什么时候完成的