0

关于 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);

此代码解决了它,感谢您的快速响应

4

2 回答 2

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);
}
于 2013-10-16T23:52:42.580 回答
1

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

  1. 初始化空列表
  2. 向服务器发送请求
  3. 尝试用空列表提醒
  4. 一段时间后,数据来了,你的函数真的被调用了
  5. 列表已填充,“第一个”警报提供正确的结果
于 2013-10-16T23:53:26.800 回答