Javascript 返回$.getJson数据
我试图将从JSON文件接收到的数据传递到代码中的稍后点。这是接收JSON数据的部分:Javascript 返回$.getJson数据,javascript,jquery,json,Javascript,Jquery,Json,我试图将从JSON文件接收到的数据传递到代码中的稍后点。这是接收JSON数据的部分: function getLeft(x){ var result $.get('info.json',{},function(data){ result = data.doors[x].left; console.log(result); return result; }); } 这是使用它的部分: if(getLeft(0) == tru
function getLeft(x){
var result
$.get('info.json',{},function(data){
result = data.doors[x].left;
console.log(result);
return result;
});
}
这是使用它的部分:
if(getLeft(0) == true){
alert("door is locked");
}
通过调试,我知道getLeft函数返回的结果是正确的数据,但实际上检查getLeft(0)的数据结果是未定义的。我已经在谷歌上搜索过了,但我仍然很困惑它为什么会这样,或者如何修复它。我对jQuery和Javascript非常陌生,因此非常感谢您的帮助。这不起作用,因为
getLeft()
不会返回任何内容。ajax调用被异步触发,回调中的return语句从回调上下文返回。您不能做这样的事情
正如您编写的那样,return语句与外部函数“getLeft”无关,而是与内部回调函数相关
默认情况下,Ajax是异步的,因此您必须等待调用回调才能获得结果,您不能直接返回结果。调用
$。get
调用是异步的,因为通过Internet的请求可能需要很长时间
一个快速解决方法是使同步
function getLeft(x){
var result;
$.ajax('info.json',{async:false, success:function(data){
result = data.doors[x].left;
console.log(result);
}});
return result;
}
不过,请阅读异步处理的相关内容。这确实需要一些时间来适应,但这是更好的练习
编辑:示例:在代码之前添加此指令:
$.ajaxSetup({
async: false
});
因为ajax调用应该在这种情况下进行
您应该修改代码,如下所示:
function getLeft(x){
var result
$.get('info.json',{},function(data){
result = data.doors[x].left;
console.log(result);
});
// Return statement here and not in ajax call
return result;
}
更新:
另一种方法是使用钩子模式来避免同步性的pb:
function getLeft(x,callbk){
$.get('info.json',{},function(data){
if(typeof callbk=='function'){
callbk.call(this,x, data.doors[x].left)
}
});
}
已知callbk参数是函数的名称:
function myFn(x,result){
if(x==0 && result){
alert("door is locked");
}
}
例如:
getLeft(0,myFn)
阅读AJAX代表什么,并密切关注第一个
A
。这里有人问这个问题daily@charlietfl,这一点很好,但仅供参考,首字母缩略词AJAX不能从字面上理解。大多数人使用AJAJ(JSON而不是XML)。但大多数人仍然将其称为AJAX。所以,如果有人从字面上理解了整个AJAX首字母缩略词,他们可能会有误解。@PaulDraper想知道为什么刚才的X也。。。。既然AJAX
是jQueryAPI导航中的第一行项目……我们真的没有责任将其重命名为async false,我只是简单的错误实践为什么沉默的否决?这个答案是100%正确的,这是唯一一个显示OP代码修复的答案。但它已被弃用,并且肯定有其他方法可以阻止OPbrowser@charlietfl,异步未被弃用@nietonfir,那么为什么JSFIDLE可以工作呢?我不建议将其放在ajaxSetup
中。它将使所有调用同步。而是把它放在电话本身上(见我的答案)。不正确。使XMLHttpRequest异步是可选的(但最佳实践)。