2011-06-10 4 views
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    
} 

답변

0

합니까 populateForm ('Form1이') 함수를 반환? Deferred. 다음과 같은 콜백 함수를 기대합니다. 그처럼 :

var populateForm = function (j, target) { 
    return function() { 
     $.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;     
      }           
     }); 
    }  
} 

$.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)); 
+0

사실, xhr 개체로 무엇이든 할 필요가 없습니다. populateForm()을 실행하기 전에 모든 Ajax 함수가 완료되었는지 확인하는 방법을 찾고있다. 다른 방법이 있습니까? 이것은 꽤 일반적인 시나리오이지만 JQuery를 처음 접했고 솔루션을 찾을 수 없었습니다. – Edward

+0

콜백을 반환해야합니다 (콜백 함수 *는 꽤 일반적입니다). 매개 변수를 사용하지 않는다면 매개 변수를 생략 할 수 있습니다. – Daff

+0

안녕하세요, 귀하의 답변에 감사드립니다. 반환 함수를 추가하려고했지만 populateForm 함수는 여전히 시간 전에 실행됩니다. 원래의 질문에 실제 코드를 추가하겠습니다. (원래는 단순화하여 너무 길지 않았습니다.) – Edward

관련 문제