检测多个异步javascript$.ajax调用的完成情况

检测多个异步javascript$.ajax调用的完成情况,javascript,jquery,ajax,asynchronous,Javascript,Jquery,Ajax,Asynchronous,我有一个javascript函数,它进入一个循环并为每个循环发出一个异步ajax调用。我需要知道所有ajax调用何时返回并被处理,因为我想在此时更新UI 循环如下: function sync_SyncLocalStorageToServer() { if (helper_IsAppOnline()) { $.log('sync_SyncLocalStorageToServer detects app is ONLINE'); // Post each c

我有一个javascript函数,它进入一个循环并为每个循环发出一个异步ajax调用。我需要知道所有ajax调用何时返回并被处理,因为我想在此时更新UI

循环如下:

function sync_SyncLocalStorageToServer() {
    if (helper_IsAppOnline()) {
        $.log('sync_SyncLocalStorageToServer detects app is ONLINE');
        // Post each cached entry to the server - this is the main sync function
        for (var i = 0, len = localStorage.length; i < len; i++) {
            var lskey = localStorage.key(i);
            if (lskey.substr(0, 8) === 'response') {
                $.log('Sync found response with key=' + lskey);
                var postdata = localStorage.getItem(lskey); // Get the form data
                $.log('Calling server with ls response:' + postdata);
                var localkey = lskey;
                $.ajax({
                    type: "POST",
                    dataType: 'json',
                    url: "/Profile/PostForm",
                    data: { jsonpost: postdata },
                    success: function (data) {
                        if (data.rc == "success") {
                            localStorage.removeItem(data.localStorageKey); // Remove the relevant localStorage entry
                            $.log('ServerSuccess:' + data.message + ',removed localStorageKey=' + data.localStorageKey);
                        } else {
                            $.log('ServerUnhappy:' + data.message + ',did not remove localStorageKey=' + data.localStorageKey);
                        }
                    }
            , error: function (data) {
                $.log('ERR:' + data);
            }
                });
            }
        }
    }
    else {
        $.log('sync_SyncLocalStorageToServer detects app is OFFLINE');
    }
}
函数sync\u SyncLocalStorageToServer(){
if(helper_IsAppOnline()){
$.log('sync\u SyncLocalStorageToServer检测到应用程序处于联机状态');
//将每个缓存条目发布到服务器-这是主要的同步功能
for(var i=0,len=localStorage.length;i
当最后一个异步ajax调用最终从服务器返回时,我调用UI刷新函数的最简单方法是什么


谢谢。

最简单的方法是将处理程序附加到事件。如果需要更多的钩子,还可以附加到其他钩子。

计算执行AJAX请求的次数,然后计算看到对已完成回调的调用的次数。一旦回调完成计数等于发出ajax调用的次数,您就知道完成了

var total = arr.length;
var count = 0;
for(var i = 0; i < arr.length; i++){
     $.ajax({
        // other options
        complete: function(){
            count++;
            if(count == total){ 
                // all finished!
            }
        }
     });
}
var total=arr.length;
var计数=0;
对于(变量i=0;i

请注意,我使用的是“complete”回调,而不是“success”,因为如果其中一个请求失败,将不会调用“success”,而是调用“complete”。另外,我首先声明了“总计”中的预期金额,而不是本例中的累计金额。这只是避免了一种不太可能(尽管技术上可能)的情况,即在发布所有挂起的ajax请求之前完成所有请求,并因此拥有一个匹配的计数。

我是否可以在函数顶部创建一个var,然后调整它?这样做会有任何可能的作用域或线程问题吗?非常感谢。