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

回答

0

不populateForm( 'form1的')返回一个函数?推迟。然后期待回调函数,例如像这样:

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 2011-06-10 19:17:41

+0

您仍然必须返回回调(回调函数*是一件很常见的事情)。如果你不使用它们,你可以省略参数。 – Daff 2011-06-10 19:32:51

+0

嗨达夫,谢谢你的回答。我尝试添加一个返回函数,但populateForm函数仍然会在时间之前执行。让我将实际代码添加到原始问题中(我原来简化了它,所以不会那么长)。 – Edward 2011-06-10 19:47:24