0
我有多个由Ajax异步请求填充的HTML列表。当所有这些请求都完成(其中有很多请求)时,我需要通过选择与我的客户记录相对应的列表项来填充表单。推迟与异步Ajax请求完全不工作
我试图使用deferreds来实现这一点,但函数结束了早在列表填充之前开火。有任何想法吗?
$.when(
$.ajax({
url: "get-status.php",
async: true,
dataType: 'json',
success: function (j) {
var options = '';
$.each(j, function(key, value) {
options += '<option value="' + key + '">' + value + '</option>';
});
$("select#status_id").html(options);
}
}),
$.ajax({
url: "get-groups.php",
async: true,
dataType: 'json',
success: function (j) {
var options = '';
$.each(j, function(key, value) {
options += '<option value="' + key + '">' + value + '</option>';
});
$("select#group_id").html(options);
}
})
).then(populateForm('form1',customer_id));
实际应用代码:
<!-- Main function -->
populateFormBoxSS = function(id){
$.ajax({
url: "get-json-fich_ss.php?id="+id,
async: false,
dataType: 'json',
success: function (j) {
// Populate drop-downs
$.when(populateEstadosTest('box-estado_id')).then(populateFormGeneric(j, "box"));
}
});
}
<!-- Generic Form Population -->
populateFormGeneric = function (j, target) {
$.each(j, function(key, value) {
switch ($('#'+target+'-'+key).attr('type')) {
case 'checkbox':
if(value==1) {
$('#'+target+'-'+key).attr('checked', true);
}
break;
default:
$('#'+target+'-'+key).val(value);
break;
}
});
return function(){
// Do nothing
}
}
<!-- Dropdown list population -->
populateEstadosTest = function(field){
var dfd = new $.Deferred();
$.ajax({
url: "get-json-esta.php",
async: true,
dataType: 'json',
success: function (j) {
var options = '';
$.each(j, function(key, value) {
options += '<option value="' + key + '">' + value + '</option>';
});
$("select#"+field).html(options);
// Resolve Deferred
dfd.resolve();
}
});
return dfd.promise(); // Returns a promise
}
事情是,我真的不需要对xhr对象做任何事情。我只是想在执行populateForm()之前确保所有ajax函数都完成。有其他方法吗?这应该是一个很常见的情况,但我是JQuery的新手,并且我一直无法找到解决方案。 – Edward 2011-06-10 19:17:41
您仍然必须返回回调(回调函数*是一件很常见的事情)。如果你不使用它们,你可以省略参数。 – Daff 2011-06-10 19:32:51
嗨达夫,谢谢你的回答。我尝试添加一个返回函数,但populateForm函数仍然会在时间之前执行。让我将实际代码添加到原始问题中(我原来简化了它,所以不会那么长)。 – Edward 2011-06-10 19:47:24