从数组调用多个ajax并在完成时处理回调

我之前稍微使用过jQuery中的promises – 但是我无法将它应用到这个场景中。 我更喜欢使用$ .when()和$ .done()方法来实现这一点。

根据我的理解,我需要构建一个$ .Deferred对象来记录请求,当这些请求完成时 – 触发回调。 在我的代码下面,回调是 ajax请求之前触发而不是之后 – 也许我只是需要一些睡眠

我知道我的代码不完整我一直在努力通过添加for循环来应用它。

http://jsfiddle.net/whiteb0x/MBZEu/

var list = ['obj1', 'obj2', 'obj3', 'obj4', 'obj5']; var callback = function() { alert("done"); }; var requests = []; var ajaxFunction = function(obj, successCallback, errorCallback) { for(i = 0; i < list.length; i++) { $.ajax({ url: 'url', success: function() { requests.push(this); } }); } }; $.when($.ajax(), ajaxFunction).then(function(results){callback()}); 

$.when的参数应该是$.ajax的返回值,也不需要单独调用 – 这没有任何意义。 你想要这样的东西:

 for (i = 0; i < list.length; i++) { requests.push($.ajax(...)); } $.when.apply(undefined, requests).then(...) 

需要.apply的原因是因为$.when .apply可以接受多个参数,但不能接受参数数组。 .apply基本上扩展到:

 $.when(requests[0], requests[1], ...) 

这也假定请求可以按任何顺序完成。

http://jsfiddle.net/MBZEu/4/ - 注意在完成所有成功消息后,“done”会记录到控制台。

我分享了一个简单的示例,可以帮助您处理多个请求及其响应:

 var arr = [ $.ajax({url:"test1.php"}), $.ajax({url:"test2.php"}), $.ajax({url:"test3.php"}) ]; $.when.apply( undefined, arr ).then(function() { var objects=arguments; console.dir(objects); });