想象一下,我们必须得到ajax请求的来源。我想在触发所有回调时执行一些操作。除了这种方法之外,如何做到这一点:
(function($){
var sources = ['http://source1.com', 'http://source2.com'],
guard = 0,
someHandler = function() {
if (guard != sources.length) { return; }
//do some actions
};
for (var idx in sources) {
$.getJSON(sources[idx], function(){ guard++; someHandler(); })
}
})(jQuery)
我不喜欢的是,在这种情况下,我无法处理响应失败(例如,我无法设置响应的超时)和整体方法(我想应该有一种方法可以使用更多功能编程的力量在这里)
有什么想法吗?
问候!
UPD:感谢带有链接回调的解决方案。我发现了一个很好的方法here:这是评论中提出的内容:
(function hidenext(jq){
jq.eq(0).fadeOut("fast", function(){
(jq=jq.slice(1)).length && hidenext(jq);
});
})($('div#bodyContent a'))
经过一些调整后,它可以等待最后一次回调。
现在我想处理长时间运行的请求。任何线索?
答案 0 :(得分:2)
重复javascript: execute a bunch of asynchronous method with one callback
function createCallback(limit, fn){
var finishedCalls = 0;
return function(){
if (++finishedCalls == limit){
fn();
}
};
}
var callback = createCallback(4, function(){
alert("woot!");
});
async1(callback);
async2(callback);
async3(callback);
async4(callback);
答案 1 :(得分:0)
您总是可以在选项中使用带有“async:false”的$ .ajax和/或使用正确的回调(beforeSend,error,dataFilter,success和complete)。
答案 2 :(得分:0)
也许你可以'级联'下载,所以第一个getJSON的回调会触发下一个源的下载,依此类推?然后在最后一个回调中你没有任何消息来源,可以调用你的'完成'功能。
答案 3 :(得分:0)
也许我错了 - 但规则是:AJAX的序列化 - 一次一个 所以你必须链接它 - 每个响应(回调函数)必须依次提交下一个
* .onreadystatechange会在你准备就绪时给你控制(一个功能) - 在这里你可以依次提交下一个