0
Ajax 비동기 요청으로 채워지는 HTML 목록이 여러 개있다. 모든 요청이 완료되면 (그 중 많은 수가) 고객 레코드에 해당하는 목록 항목을 선택하여 양식을 채워야합니다.비동기식 Ajax 요청으로 전혀 작동하지 않는다.
이 작업을 수행하기 위해 지연을 사용하려하지만이 기능은 목록이 채워지기 오래 전에 종료됩니다. 어떤 아이디어?
$.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
콜백을 반환해야합니다 (콜백 함수 *는 꽤 일반적입니다). 매개 변수를 사용하지 않는다면 매개 변수를 생략 할 수 있습니다. – Daff
안녕하세요, 귀하의 답변에 감사드립니다. 반환 함수를 추가하려고했지만 populateForm 함수는 여전히 시간 전에 실행됩니다. 원래의 질문에 실제 코드를 추가하겠습니다. (원래는 단순화하여 너무 길지 않았습니다.) – Edward