我之前稍微使用过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()});
答案 0 :(得分:50)
$.when
的参数应该是$.ajax
的返回值,它也不需要单独调用 - 这没有任何意义。你想要这样的东西:
for (i = 0; i < list.length; i++) {
requests.push($.ajax(...));
}
$.when.apply(undefined, requests).then(...)
需要.apply
的原因是因为$.when
可以接受多个参数,但不能接受参数数组。 .apply
主要扩展为:
$.when(requests[0], requests[1], ...)
这也假定请求可以按任何顺序完成。
http://jsfiddle.net/MBZEu/4/ - 注意在完成所有成功消息后,“完成”会记录到控制台。
答案 1 :(得分:7)
我分享了一个简单的示例,可以帮助您处理多个请求及其响应:
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);
});