等待.each()。getJSON请求在执行回调之前完成

我有一个jquery .each循环,它从json请求中检索具有特定类的页面上所有元素的远程数据。 一组元素是一组li标签,在使用远程信息更新li元素之后,我想使用另一个函数对其进行排序。

.each循环之后传递sort函数不会对列表进行排序,因为项目尚未从json请求中完成加载。 排序工作如果我将sort函数作为getJSON请求的.complete回调传递,但我只希望排序为整个列表运行一次,而不是每个项目。

 fetch_remote_data(function(){sort_list_by_name();}); function fetch_remote_data(f){ jQuery('.fetching').each(function(){ var oj = this; var kind = this.getAttribute('data-kind'); var url = "http://something.com" jQuery.getJSON(url, function(json){ $(oj).text(json[kind]); $(oj).toggleClass('fetching'); }); }); if (typeof f == 'function') f(); }; 

有什么建议?

如果你正在使用jQuery 1.5,你可以利用它的$ .Deferred实现:

 function fetch_remote_data(f) { var requests = [], oj = this, url = "http://something.com"; $('fetching').each(function() { var request = $.getJSON(url, function(json) { $(oj).text(json['name']); $(oj).toggleClass('fetching'); }); requests.push(request); }); if (typeof f === 'function') $.when(requests).done(f); } // No need to wrap this in another function. fetch_remote_data(sort_list_by_name); 

我假设你的例子中的$('fetching')位不是真正的代码? 该选择器将在DOM中搜索元素,这可能不是您想要的。

尝试在触发每个()之前获取要执行的提取总数。 然后附加.complete回调,其中首先增加已完成请求的一些计数,并且仅当已完成的数量等于要执行的总数时才进行排序。 原则上,只有在所有调用的ajax完成后才应运行sort … K.