2013-01-01 102 views
1

jQuery有以下问题。我用这个代码:jQuery文档准备好调用序列

function populate_select_from_json(select, json_url) { 
    select.empty(); 
    $.getJSON(json_url, function(data) { 
     $.each(data, function(key, value) { 
      $("<option></option>") 
       .attr("value", value.name) 
       .text(value.title) 
       .appendTo(select); 
     }); 
    }); 
    select.children(":first").attr("selected", true); 
} 
$(document).ready(function() { 
    var value_type = $("#value_type"); 
    populate_select_from_json(value_type, SOME_URL); 

    var unit = $("#unit"); 
    populate_select_from_json(unit, ANOTHER_URL + value_type.val()); 

}); 

我想:

  1. 将文档
  2. 从相关数据库
  3. 把数据获取#value_type <select>项一些JSON数据
  4. 获取值#value_type选择,并再次查询数据库以填充另一个选择项目。

的问题是,当我叫value_type.val(),它总是输出null,即使#value_type <select>填充正确。我在这里做错了什么?

+1

** A ** JAX是** **异步。在调用'value_type.val()'的时刻,该字段尚未填充。我建议使用延迟对象来链接Ajax调用:http://api.jquery.com/category/deferred-object/。 –

+0

正是我的想法!它看起来像该领域尚未填充。浏览器是否在另一个线程中调用我的方法,以便从.ready回调函数中分离出来? – artonson

+0

我想要检索数据,一些后台进程开始,但JS中没有线程。 –

回答

2

我想这样的事情可能会更好用promises

沿着这些线(未测试):

var populate_select_from_json = function($select, json_url) { 
    $select.empty(); 
    return $.getJSON(json_url, function(data) { 
     $.each(data, function(key, value) { 
      $("<option></option>") 
       .attr("value", value.name) 
       .text(value.title) 
       .appendTo($select); 
     }); 
     $select.children(":first").attr("selected", true); 
    }); 
}; 

$(document).ready(function() { 
    var $value_type = $("#value_type"); 
    var $unit = $("#unit"); 

    populate_select_from_json($value_type, SOME_URL).done(function(){ 
     populate_select_from_json($unit, ANOTHER_URL + $value_type.val()); 
    }); 
});