我从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);
为此,我如何在第二次警报时强制使用正确的值,换句话说, 如何强制以正确的顺序运行代码....
答案 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);
});
}