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

时间:2011-06-24 00:34:59

标签: jquery callback delay 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();
};

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

如果你正在使用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中的<fetching>元素,这可能不是您想要的。

答案 1 :(得分:0)

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