2016-11-29 133 views
0

這是一個工作良好的JavaScript代碼的一部分。 但我想,以顯示//練習2行中的變量選項:javascript - 這段代碼有什麼錯誤?

if(profId==10){ 
    //alert(profId); 
    $("#div_sel_residentType").show("slow"); 

    var selectElm="<label for=\"sel_residentType\">Sélectionniez le Type du Résident:</label><select class=\"form-control\" id=\"sel_residentType\"><option value=\"0\" selected=\"\">Type Résident</option>"; 
    var options =""; 
    $.get("../api/v1/get/menus/typeresident.json.php", function(dataset, status){ 
     for (var index in dataset){ 
      options = options + "<option value=\""+dataset[index].id+"\">"+dataset[index].description+"</option>"; 
      //console.log(options); 
     } 
     console.log(options);//Ex1 
    }); 

    console.log(options);//Ex2 
    selectElm = selectElm + options + "</select>"; 
    //console.log(selectElm); 
    //$("#div_sel_residentType").html(selectElm); 
} 

我想了解爲什麼它顯示console.log(options);//Ex1但不console.log(options);//Ex2

+3

執行'$ .get'調用後立即執行'Ex2'。呼叫收到響應後執行'Ex1'。 –

+0

'$ .get'是異步的,這意味着當你的響應可用時,你交給它的函數將被調用。與此同時,你的代碼已經被執行,來到// Ex2,其中選項仍然是「」。 – connexo

回答

1

該ajax調用是async這意味着該值在當時不存在於Ex2。解那就是利用deferred對象看看這個頁面:從鏈接DOC

實施例:

由於jQuery.get方法返回一個jqXHR對象,其被衍生 從Deferred對象,我們可以使用 .done()方法附加成功回調。從你的代碼

完整的示例:

var options = ""; 
var defObj = $.get("../api/v1/get/menus/typeresident.json.php", function(dataset, status) { 
     for (var index in dataset) { 
     options = options + "<option value=\"" + dataset[index].id + "\">" + dataset[index].description + "</option>"; 
     //console.log(options); 
     } 
     console.log(options); //Ex1 
    }); 

// get something done after ajax respone 
defObj.done(function() { 
    console.log(options); //Ex2 
    selectElm = selectElm + options + "</select>"; 
}); 

,或者你可以在單行做到這一點:

$.get(/*...*/).done(/*...*/); 
1

$.get(...)發起異步調用。因此,執行過程將繼續執行以下語句,並且稍後(GET請求完成後)將執行回調。

所以console.log(options);//Ex2行被執行之前options被填充。所以它相當於console.log("")

+0

是的..這是真的..如何使$ get()之後的回調? – zwitterion

+0

好吧,別擔心......我只是把一個.done()解決了。謝謝 – zwitterion

0
console.log(options); //Ex2 

這實際上執行第一。再看看變量options是如何定義的:

var options = ""; 

所以,如果你正在尋找的東西打印到控制檯,它只是白色空間,所以什麼也不會顯示出來。