【发布时间】:2014-06-11 14:01:05
【问题描述】:
我正在尝试在 AJAX 循环中使用延迟承诺,因为使用 async: false 会锁定页面。我已经探索过其他类似的用途,但我不明白为什么 $.when().apply().then() 永远不会执行。
var userData = {};
userData.user1 = {"creds":{"userid":"user1@test.com","password":"user1pass","country":"us"}};
userData.user2 = {"creds":{"userid":"user2@test.com","password":"user2pass","country":"mx"}};
userData.user3 = {"creds":{"userid":"user3@test.com","password":"user3pass","country":"ca"}};
function loginUser(credentials){
var def = new $.Deferred();
requests = [];
$.each(credentials, function(k, v){
var promise = $.ajax({
url : '/path/to/my/uri',
type : 'post',
contentType : 'application/json',
data : JSON.stringify(v)
});
requests.push(promise);
});
console.log(requests);
// check if all ajax calls have finished
$.when.apply($, requests).then(function() {
// this never happens
def.resolve();
return def.promise();
console.log('the request is done');
});
}
loginUser(userData);
//updated snippet
var userData = {};
userData.user1 = {"creds":{"userid":"user1@test.com","password":"user1pass","country":"us"}};
userData.user2 = {"creds":{"userid":"user2@test.com","password":"user2pass","country":"mx"}};
userData.user3 = {"creds":{"userid":"user3@test.com","password":"user3pass","country":"ca"}};
function loginUser(credentials){
var requests = $.map(credentials, function(k, v){
return $.ajax({
url : '/path/to/my/uri',
type : 'post',
contentType : 'application/json',
data : JSON.stringify(k)
});
});
console.log(requests);
// return a promise that will resolve when all ajax calls are done
return $.when.apply($, requests);
}
loginUser(userData).done(function() {
// all logins completed here
console.log('inside done');
}).fail(function() {
// will be called if any login failed
console.log('inside fail');
});
// current syncronous functionality
function loadUrls(credentials){
$.each(credentials, function(k, v){
$.ajax({
url : '/path/to/my/uri',
type : 'post',
contentType : 'application/json',
success: function(data, textStatus, jqXHR) {
$('body').append('<a target="_blank" href="'+data.userInfo+'">'+data.userName+' '+k+'</a><br />');
},
data : JSON.stringify(v),
error : function(jqXHR, textStatus, errorThrown){
return;
},
async : false
});
});
}
【问题讨论】:
-
您确定所有请求都已成功发送和处理吗?尝试将
then更改为done或附加fail处理程序以及then。 -
如果您想在其他地方使用它,您应该在 loginUser 的末尾返回
def.promise(),而不是$.when,但这不应阻止日志语句的发生。 -
不,但是
return调用将... -
@orzechowskid Doh!你完全正确。
标签: jquery ajax promise deferred