jquery ajax的async属性的理解

 1 $(function(){
 2     queryTemplateSort();
 3     //
 4     fillAddTemplatePage();
 5     function queryTemplateSort() {
 6         $.ajax({
 7             type: "post",
 8             url: "http://localhost:8080/...",
 9             data: {"pageNo": 1, "pageSize": 20},
10             dataType: "json",
11             success:function(data){
12                 var sortArray = data.dataList;
13                 for(var i = 0; i < sortArray.length; i++) {
14                     var option = "<option value='"+ sortArray[i].id +"'>"+ sortArray[i].name +"</option>";
15                     var $selectElement = $(".templateSelectDiv select");
16                     $selectElement.append(option);
17                 }
18             }
19         }); 
20     }
21     fillAddTemplatePage();
22     function fillAddTemplatePage() {
23     var varUrl = window.location.search;
24     if(varUrl === "") {
25         return;
26     }
27     var topicid = "" + parseToNum(varUrl);
28     var jsonObject = {"topicid": topicid};
29     var jsonStr = JSON.stringify(jsonObject);
30     $.ajax({
31         type: "post",
32         url: "http://localhost:8080/....",
33         data: {'params':jsonStr},
34         dataType: "json",
35         success: function(data){
36             fillData(data.obj);
37         }    
38     });
39}
40        /**填充页面数据*/
41 function fillData(data) {
42     document.getElementById("magazineTopicId").value = data.id;
43     $(".templateSelectDiv select option[value='" + data.categoryId + "']")[0].selected = true;    //erro undefined
44     document.getElementById("title").value = data.varName;
45     document.getElementById("chooseMusic").value = data.music.name;
46     document.getElementById("musicLink").value = data.music.link;
47     fillPage(data);
48}
49      .....
50}
1 //jsp
2 <div class="templateSelectDiv">
3     <select >
4         <option value="0">全部</option>
5     </select>
6 </div>

加载这个jsp的时候调用queryTemplateSort方法,其中用ajax请求到数据后把选项拼接到这个select框中,第24行如果请求的url没有带参数则不填充页面数据,如果带了参数就根据一个id去查询这个页面的数据,然后回写到页面,但是因为在调用queryTemplateSort方法,ajax请求没有设置async属性,默认为true,支持异步,就是执行queryTemplateSort方法的同时分出一个线程继续向下执行fillAddTemplatePage方法,而这个方法的选择器选中的元素是queryTemplateSort执行完毕后才添加上去的,所以当如果queryTemplateSort没执行完就执行fillAddTemplatePage,下面这个语句就会报undefined的错误。当设置async: false时(意思是不分出另外的线程,执行完该方法后才会继续执行其他代码),这个时候当再执行到fillAddTemplatePage时,queryTemplateSort已经执行成功,这时就不会报错。

$(".templateSelectDiv select option[value='" + data.categoryId + "']")[0].selected = true;
后来发现就算取消了异步请求这样选中下拉框的选项还是会出现undefined的错误,而下拉框已经加载完成,不得要领,后来无赖改成
$(".templateSelectDiv select").val(data.categoryId)来选中下拉框。
原文地址:https://www.cnblogs.com/dengmj/p/4913951.html