1

我从 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);

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

4

1 回答 1

4

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

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

你更好的选择是接受网络通信的异步特性,无论你有什么需要使用这些数据,让它提供一个回调:

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);
});

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

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

function getTheData(callback) {
    jQuery.getJSON("get_data.json", function(msg){
        callback(msg.first);
    });
}
于 2012-12-07T18:49:36.630 回答