Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 在执行回调之前,等待.each().getJSON请求完成_Jquery_Callback_Delay_Getjson - Fatal编程技术网

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

Jquery 在执行回调之前,等待.each().getJSON请求完成,jquery,callback,delay,getjson,Jquery,Callback,Delay,Getjson,我有一个jquery。每个循环都从json请求中检索远程数据,该请求针对某个类的页面上的所有元素。一组元素是一组li标记,我想在li元素用远程信息更新后使用另一个函数对其进行排序 在之后传入sort函数。每个循环都不会对列表进行排序,因为项目尚未完成从json请求加载。如果我将sort函数作为getJSON请求的.complete回调传入,则排序可以工作,但我只希望对整个列表运行一次排序,而不是对每个项目 fetch_remote_data(function(){sort_list_by_nam

我有一个jquery
。每个
循环都从json请求中检索远程数据,该请求针对某个类的页面上的所有元素。一组元素是一组
li
标记,我想在
li
元素用远程信息更新后使用另一个函数对其进行排序

之后传入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,您可以利用它的$。延迟实现:

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

这是很长一段时间以来对jquery最好的更改之一+1我意识到我的代码中有一个输入错误,应该是$(“.fetching”)。我正在DOM中搜索类中的所有元素。获取然后发出远程请求并替换该元素的文本。