2011-06-24 176 views
2

我有一个jquery .each循环,该循环从具有特定类的页面上的所有元素的json请求中检索远程数据。一组元素是一组li标签,我想在使用远程信息更新li元素之后使用另一个函数进行排序。等待.each().getJSON请求在执行回调之前完成

.each循环之后传入排序函数不会对列表排序,因为项目尚未从json请求中完成加载。排序工作如果我将排序功能作为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(); 
}; 

有什么建议吗?

回答

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>元素,这可能不是您想要的。

+0

长久以来对jquery的最佳变化之一。 +1 –

+0

我意识到我的代码中存在拼写错误,它应该是$('。fetching')。我正在通过DOM搜索所有具有类的元素.fetching然后发出远程请求并替换该元素的文本。 – Joey

0

尝试获取在每个()之前执行的提取总数。与附加.complete回调相比,您可以首先增加一些已完成请求的数量,并仅在已完成数量等于要执行的总数时进行排序。原则上,只有在所有被调用的Ajax完成后,才应该运行排序... K

相关问题