返回$ .getJson数据

时间:2013-11-03 23:08:04

标签: 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) == true){
     alert("door is locked");
}

通过调试我知道getLeft函数的结果是返回正确的数据,但实际上检查getLeft(0)的数据是未定义的。我用谷歌搜索了这个,但我仍然对它为什么这样做,或者如何修复它感到困惑。我是jQuery和Javascript的新手,所以任何帮助都会非常感激。

4 个答案:

答案 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;
}

虽然读了有关异步处理的内容。它确实需要一些人习惯,但这是更好的做法。

编辑:示例:http://jsfiddle.net/bL4Aj/

答案 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)