2013-02-01 22 views
2

可能重复:
jQuery: Return data after ajax call success奇怪的行为与JavaScript全局变量和jQuery

首先我不是很有经验的JS或jQuery的,但据我的编程技巧去我似乎无法找到我的方法有任何问题。

var subtree; 

$.post("addTreeServlet", 
    { 
     term:clickedNode, 
     max:maxId, 
     id:clickedId 
    }, 
    function(jsonResponse){ 

     subtree = eval('(' + jsonResponse + ')'); 

    } 
); 

$jit.json.prune(subtree, level); 
return { 
    'id': nodeId, 
    'children': subtree.children 
}; 

我通过与调试器的代码去了,这里是发生了什么:该程序从addTreeServlet回来,将表示JSON数据的字符串。 eval()函数接受这个String并将其转换成一个JSON对象(再次,它在调试器中看起来非常好)。但只要我离开函数(jsonResponse),var子树显示为undefined,我无法弄清楚原因。

是因为jQuery方法吗?我不知道...

这也是同样的行为,如果我只是把子树=“无论”。一旦我退出函数,它就变得不确定了。

+7

这并不奇怪,这是尝试使用异步代码获取同步结果的结果。你不能访问'$ .post'回调函数之外的'subtree'。该功能背后的逻辑将需要以不需要返回数据的方式重新完成。 –

+4

不要使用'eval' jQuery会安全地为你解析JSON。 – zzzzBov

+2

因为你的'function(jsonRepsonse)'之后的代码在你设置'subtree'的函数之前执行**。这是异步代码的回调。它不一定是在javascript中自上而下的。 – Chad

回答

1

它正在等待回应,但您的脚本会立即通过浏览器进行解析。所以你需要在接收到post响应之后做你想做的与ajax响应。

function(jsonResponse){ 
    var subtree = eval('(' + jsonResponse + ')'); 
    doSomthingWithResponse(subtree); 
} 
+0

是的,thx,我的问题现在回答。我只是把回调同步。这适用于我的情况,导致发送/接收和显示数据之间的动画比较长。 – PogoMips

0

的问题是$。员额异步做这项工作给你,而$下方的电话...您使用$就用,而不是

同步调用的返回.post的前得到执行代码
var subtree; 
     $.ajax({ 
      type: 'POST', 
      url: "addTreeServlet", 
      data: { 
       term: clickedNode, 
       max: maxId, 
       id: clickedId 
      }, 
      success: function (jsonResponse) { 

       subtree = eval('(' + jsonResponse + ')'); 

      }, 
      async: false 
     }); 

     $jit.json.prune(subtree, level); 
     return { 
      'id': nodeId, 
      'children': subtree.children 
     };