2010-05-28 47 views
9

想象一下,我们必须通过ajax请求源代码。当所有回调被触发时,我想执行一些操作。等待所有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

这个问题之前已经被问到过了,而不是XHR,它是一系列的DOM事件。我也不记得问题的名称。 – 2010-05-28 10:43:06

回答

0

也许你可以“串联”的下载,所以第一的getJSON回调触发从下一个源下载,等等?然后在最后一次回调中,您没有剩余的来源,可以调用您的“完成”功能。

+0

是的,这是一个好主意!我会尝试并回来。但仍然是响应失败的问题... – glaz666 2010-05-28 10:57:13

+0

@ glaz666:为什么不能设置超时或定义处理错误的错误回调? – 2010-05-28 11:02:51

+0

如何设置超时时间? :)错误回拨OK – glaz666 2010-05-28 11:09:27

0

您可以在选项中始终使用$ .ajax和/或使用适当的回调函数(beforeSend,error,dataFilter,success和complete)以及“async:false”。

+1

'async:false'会在请求发出时冻结浏览器UI。 – 2010-05-28 10:44:12

+0

async:false - 可以是一个选项,谢谢。但在'成功'或'完整'的情况下,它不会工作,因为它将与jQuery相同 – glaz666 2010-05-28 10:49:48

+0

我真的建议不要使用async:false,用户体验对于这些类型的请求永远不会太好。 – SBUJOLD 2010-05-28 13:20:03

0

也许我错了 - 但是规则是:AJAX的系列化 - 一次一个 让你不得不链它 - 每一个响应(回调函数)必须提交反过来

下一个*。 onreadystatechange会给你一个控制权(这是一个函数)) - 在这里你可以依次提交下一个