无法访问Scope中的Javascript变量..?

时间:2014-06-05 14:11:36

标签: javascript jquery ecmascript-5

以下是我的javascript代码..我宣布变量' allproductsAndPrice'在函数之外..但是在初始化之后我无法访问它。难道我做错了什么? 当我试图提醒它时,它不打印任何东西。

var allproductsAndPrice = "";
$.getJSON("/Home/GetProducts",
    function (data, textStatus, jqXHR) {
        for (var i = 0; i < data.length; i++) {
            allproductsAndPrice = allproductsAndPrice + 
                "<option name='productName' id=" + data[i].productPrice + ">" + 
                data[i].Pname + "</option>";
        }
    }
);

alert(allproductsAndPrice);

2 个答案:

答案 0 :(得分:1)

这里的错误是在调用getJSON的回调之前会调用警报。这意味着allProductsAndPrice始终是警报中的空字符串。

getJSON的调用是异步的,这意味着它将在ajax请求上触发“完成”事件,然后将执行回调。你可以调用getJSON同步,但这有点违背这个想法。

为了更好地了解现在发生的事情是这样的:

  1. 在当前范围内将allproductsAndPrice初始化为“”。
  2. 创建Ajax请求
  3. 警告,内容allproductsAndPrice仍为“”
  4. 触发完成事件
  5. 执行回调并影响allproductsAndPrice
  6. 你应该做的是:

        var allproductsAndPrice = "";
        $.getJSON("/Home/GetProducts",
          function (data, textStatus, jqXHR) {
              for (var i = 0; i < data.length; i++) {
                  allproductsAndPrice = allproductsAndPrice + "<option name='productName' id=" + data[i].productPrice + ">" + data[i].Pname + "</option>";
              }
    
              // More code that should be executed
              alert(allproductsAndPrice);
        });
    

答案 1 :(得分:0)

试试这个。这将有效并帮助您识别是否存在错误。 第二件事var allproductsAndPrice 将在警报中保持为空,因为ajax请求是异步的,javascript不会等待ajax响应。

var allproductsAndPrice = "";
try {
    $.getJSON("/Home/GetProducts", function(data) {
        for (var i = 0; i < data.length; i++) {
            allproductsAndPrice = allproductsAndPrice + "<option name='productName' id=" + data[i].productPrice + ">" + data[i].Pname + "</option>";
        }
    });
} catch (e) {
    alert(e.message);
}
alert(allproductsAndPrice);