Javascript 返回$.getJson数据

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

我试图将从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非常陌生,因此非常感谢您的帮助。

这不起作用,因为
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异步是可选的(但最佳实践)。