-2

我正在尝试将从 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

4 回答 4

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)
于 2013-11-03T23:28:17.610 回答
0

这不起作用,因为getLeft()不返回任何东西。jax 调用异步触发,回调中return 语句从回调上下文返回。

于 2013-11-03T23:10:43.520 回答
0

你不能做这样的事。

如您所写,return 语句与外部函数“getLeft”无关,而是与内部回调函数有关。

Ajax 默认是异步的,所以你必须等待回调被调用才能得到结果,你不能直接返回。

于 2013-11-03T23:12:06.890 回答
0

$.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;
}

尽管确实阅读了有关异步处理的信息。这确实需要一些时间来适应,但这是更好的做法。

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

于 2013-11-03T23:12:08.297 回答