无法在javascript中访问变量值

时间:2011-12-15 09:22:03

标签: javascript jquery ajax variables

我有以下源代码:

var labeled_pic = new Array();
var testing;
function get_label_pic(){
    $.ajax({
        url: "localhost/advanceSearch/index/getlabelpic",
        type: "POST",
        dataType: "json",
        success: function(data) {
            $.each(data, function(key, data){
                labeled_pic[key] = data;
            });
            testing = "testing";
        }
    });
};
get_label_pic();
console.log(labeled_pic);

然后我使用get_label_pic();调用这些函数,之后我想使用labeled_pic访问labeled_pic[3]数组,但它返回undefined。我使用firebug,我尝试写这个console.log(labeled_pic),然后返回: Firebug result 如何访问labeled_pic变量,。?

5 个答案:

答案 0 :(得分:2)

问题在于您正在进行异步调用(AJAX请求),因此您的JavaScript会继续,并且不会等待调用返回。

因此,对get_label_pic()的通话将毫不犹豫,您的代码将继续直接转到console.log(labeled_pic)(尚未设置,因为您的success回调AJAX调用将不会完成。

如果你想要我们,那么你需要将你的代码放入你的AJAX成功,或者从中调用另一个函数:

function get_label_pic(){
    $.ajax({
        url: "localhost/advanceSearch/index/getlabelpic",
        type: "POST",
        dataType: "json",
        success: function(data) {
            $.each(data, function(key, data){
                labeled_pic[key] = data;
            });
            testing = "testing";

            console.log(labeled_pic); // this will show the values
            callmyOtherFunction(); // To call something else
        }
    });
};
get_label_pic();
console.log(labeled_pic); // This will be undefined

实际发生的是:

  1. 创建函数get_label_pic
  2. 致电get_label_pic()
    1. 提出ajax请求
  3. 致电console.log
  4. 脚本在最后
  5. 一段时间过后,服务器响应又回来了
    1. 遍历数据,设置labeled_pic[key]
    2. 设置testing = 'testing'
    3. 致电console.log(labeled_pic);
    4. 致电callmyOtherFunction()

答案 1 :(得分:1)

由于您的ajax调用是异步的,因此在ajax调用完成之前,您很可能会尝试读取数组。如果您创建了一个在ajax-call完成时触发的回调函数,并将您的代码放在该回调中,那么在您尝试访问该数组之前,您确定ajax调用已完成。

function get_label_pic(){
    $.ajax({
        url: "localhost/advanceSearch/index/getlabelpic",
        type: "POST",
        dataType: "json",
        success: function(data) {
            $.each(data, function(key, data){
                labeled_pic[key] = data;
            });
            testing = "testing";
        },
        complete: doWhatYouWantToDo()
    });
};

function doWhatYouWantToDo()
{
   alert(labled_pic[3]); // <!-- now the array is populated
}

答案 2 :(得分:0)

该函数是一个闭包,因此标记为pic已超出范围。

如果将它作为参数传递给回调函数,它将封装在闭包中,并在执行回调时可用。

HTH

答案 3 :(得分:0)

你必须调用console.log(labeled_pic);在$ .ajax的成功回调中

...
 success: function(data) {
            $.each(data, function(key, data){
                labeled_pic[key] = data;
            });
            testing = "testing";
            //here call the console.log
        }
...

答案 4 :(得分:0)

您必须在成功函数结束时执行该代码,因此您的代码必须如下所示:

var labeled_pic = new Array();
var testing;
function get_label_pic(){
    $.ajax({
        url: "localhost/advanceSearch/index/getlabelpic",
        type: "POST",
        dataType: "json",
        success: function(data) {
            $.each(data, function(key, data){
                labeled_pic[key] = data;
            });
            testing = "testing";

        $("#result").append("<img src='" + labeled_pic[3] +"' />");

    }
});

}; get_label_pic();