变量在jquery POST后被清除

时间:2013-10-16 23:50:51

标签: javascript jquery

关于jquery post如何工作,一定有一些我不明白的东西,因为下面的代码没有按照我期望的方式运行。

var list = [];
$.post("list", function(data){
    for(var i = 0; i < data.length; i++){
        list.push({label: data[i].label, value: data[i].value});
        alert(list[0].value);
    }
});
alert(list[0].value);

注意两个警报,第一个警报有一个值,第二个是“未定义”为什么?我怎么能绕过这个? $.get和$ .ajax我遇到了同样的问题所以我一定做错了。我试着搜索但我没找到任何东西。

更新

var templeList = [];
$.ajax({
        url: "templeList", 
        type: 'GET',
        success: function(data){
            for(var i = 0; i < data.length; i++){
                templeList.push({label: data[i].label, value: data[i].value});
                alert(templeList[0].value);
            }
        },
        cache: true,
        async:false
});
alert(templeList[0].value);

此代码解决了这个问题,感谢您的快速回复

2 个答案:

答案 0 :(得分:2)

$.post内的函数是一个回调 - 它以异步方式运行(从服务器收到响应后)。这意味着在设置list之前,实际上会先调用第二个警报。

为了解决这个问题,您通常会将第二个警报放在其自己的函数中,然后从异步回调中调用该函数:

var list = [];
$.post("list", function(data){
    for(var i = 0; i < data.length; i++){
        list.push({label: data[i].label, value: data[i].value});
        alert(list[0].value);
    }
    onReady();
});

function onReady() {
    alert(list[0].value);
}

答案 1 :(得分:1)

post方法是异步的,这意味着你的代码以下列方式执行:

  1. init empty list
  2. 向服务器发送请求
  3. 尝试使用空列表提醒
  4. 在数据出现一段时间后,您的功能真正被称为
  5. 列表已填充,“first”警报提供正确的结果