2016-11-29 104 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 = ""; 

所以,如果你正在寻找的东西打印到控制台,它只是白色空间,所以什么也不会显示出来。