我有一个$.each()
循环,循环选中一些复选框并为每个复选框调用ajax调用。显然,$.each()
并没有等待ajax。我可以在ajax调用上放置ajax:false,但由于弃用警告,我不愿意。
因此,我尝试使用$.Deferred()
,但每次迭代似乎都没有等待它。
以下是代码:
.each($checkboxes, function(key, checkbox) {
$def = $.Deferred();
$checkbox = $(checkbox);
$.ajax({
'url': 'ajax/myajaxcall.php',
'data': {
id: $checkbox.data('id')
}
}).complete(function() {
console.log('done');
$def.resolve('done');
});
return $def.promise();
});
实际解决方案
我完全了解如何使用ajax,但是上面的代码经历了许多重构和试验,以不同的方式来尝试获得我想要的结果。
我决定做的是放弃$ .each()并通过调用一个函数手动对话,通过调用一个函数,当完成后,用一个递增的键复选自己。
此解决方案100%确保ajax调用逐个运行。
var $checkboxes = $('input[name="mycheckboxes"]:checked'),
checkboxKey = 0,
checkboxLength = $checkboxes.length;
function callAjax(key) {
console.log(key);
$checkbox = $($checkboxes[key]);
console.log('call ajax');
console.log($checkbox);
$.ajax({
'url': 'ajax/myajaxcall.php',
'data': {
'id': $checkbox.data('id')
}
}).complete(function() {
console.log('done');
if(key < checkboxLength-1) {
key += 1;
createInvoice(key);
}
else {
console.log('complete');
}
});
}
if(checkboxLength > 0) {
callAjax(checkboxKey);
}