我正在尝试将我从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) == true){
alert("door is locked");
}
通过调试我知道getLeft函数的结果是返回正确的数据,但实际上检查getLeft(0)的数据是未定义的。我用谷歌搜索了这个,但我仍然对它为什么这样做,或者如何修复它感到困惑。我是jQuery和Javascript的新手,所以任何帮助都会非常感激。
答案 0 :(得分:0)
这不起作用,因为getLeft()
不会返回任何内容。 a jax调用是 asynchronosouly ,并且回调中的return语句将从回调上下文返回。
答案 1 :(得分:0)
你不能这样做。
你写的return语句与外部函数" getLeft"无关,而与内部回调函数无关。
默认情况下,Ajax是异步的,所以你必须等待回调才能得到结果,你不能直接返回它。
答案 2 :(得分:0)
$.get
来电是异步,因为通过互联网的请求可能需要很长时间。
快速解决方法是使同步。
function getLeft(x){
var result;
$.ajax('info.json',{async:false, success:function(data){
result = data.doors[x].left;
console.log(result);
}});
return result;
}
虽然读了有关异步处理的内容。它确实需要一些人习惯,但这是更好的做法。
答案 3 :(得分:0)
在代码之前添加此指令:
$.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;
}
更新:
另一种方法是使用Hook模式来避免同步性的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)