等待执行所有ajax回调的最佳解决方案

时间:2010-05-28 10:27:54

标签: javascript jquery ajax functional-programming callback

想象一下,我们必须得到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'))

经过一些调整后,它可以等待最后一次回调。

现在我想处理长时间运行的请求。任何线索?

4 个答案:

答案 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会在你准备就绪时给你控制(一个功能) - 在这里你可以依次提交下一个