以正确的exec顺序从getJSON获取值

时间:2012-12-07 18:44:51

标签: javascript jquery

我从db获取这个数据字典:

{"first":{"Head1":"6643Z","Head2":"1245Z"},"second":{"Head1":"1109E","Head2":"1231A"}}

我只需要获取“Head1”记录的第一个值,为此我添加了一个全局变量 为了从getJSON方法中获取值,但首先运行第二个警报 使用未定义的值,然后使用正确的值运行第一个警报...

 var message;
 jQuery.getJSON("get_data.json", function(msg){
    jQuery.each(msg,function (key,val){
        message=val['string_data'];
        return false;//trying to break
     });
    alert("first"+message); 
  });

alert("second"+message);

为此,我如何在第二次警报时强制使用正确的值,换句话说, 如何强制以正确的顺序运行代码....

1 个答案:

答案 0 :(得分:4)

第二个警报显示undefined的原因是,当该代码运行时,请求尚未完成。

可以制作getJSON 同步,以便在请求完成之前警报不会运行,但会导致糟糕的用户体验(锁定浏览器)jQuery将在即将推出的版本中放弃对它的支持。如果您查看文档中的getJSON,您会发现它只是一个调用ajax的包装器,如果您使用ajax,则可以指定async: false选项。 (请注意,这是正确的,因为您正在使用带有JSON的ajax;如果它是 JSON-P ,则您将没有同步选项,因为JSON-P是异步协议。)

更好的选择是接受Web通信的异步特性,无论您需要使用哪些数据,都要提供回调:

function getTheData(callback) {
    jQuery.getJSON("get_data.json", function(msg){
        var message, key;

        for (key in msg) {
            message = msg[key];
            break; // <== SEE BELOW
        }
        callback(message);
    });
}


getTheData(function(message) {
    alert("second"+message);
});

另请注意,您回来的对象没有订单,因此从中获取“第一”值的代码将不可靠。您需要知道要查找的属性键才能可靠地获取该属性的值。它们在JSON 文本中出现的顺序对结果对象中属性的顺序没有影响。 (阵列当然会有所不同。)

例如,如果您总是想要first的值,那么:

function getTheData(callback) {
    jQuery.getJSON("get_data.json", function(msg){
        callback(msg.first);
    });
}