初始化在jQuery $ .getJSON回调函数之外声明的变量

时间:2012-12-24 20:56:38

标签: javascript jquery ajax json scope

我的脚本通过jQuery发出Ajax请求。收到的数据是通过服务器端脚本(php)进行json_encoded编码的。这是进一步的,字符串化,然后使用jQuery parseJSON'来产生recordCollection。我循环遍历recordCollection并将其推送到记录数组,该数组是在回调函数范围之外声明的变量。

该功能如下所示:

var records = [] ;
$.getJSON(url, {id : recordid}, function(data) {

 var recordCollection = jQuery.parseJSON(JSON.stringify(data));

 $.each(recordCollection, function(){
  records.push(this);
 });
  console.log(records) // displays all the objects, thus, the above code is right
});  

console.log(records); // displays [] 

如上所述,我第二次将记录记录到控制台上时,它产生了一个空数组,这导致我得出两个结论:

  1. Javascript数组按值传递,因此回调函数范围之外的记录不会保留其值。

  2. Ajax是异步的,因此在ajax调用完成之前记录了记录,因此它仍然保留空的未初始化记录数组的值并将其记录到控制台上。

  3. 现在如果1为真,我该如何初始化记录数组?

    如果2为真,我应该让这个Ajax调用同步吗?这将使javascript阻塞,直到返回值,因此第二次记录数组记录到控制台,它将显示数组的更新值?

    第三是我完全错过了一个技巧,并在这里做了一些非常愚蠢的事情。

    我确实需要使用从ajax调用返回的数据来设置记录数组,因为它需要传递给脚本中的不同javascript函数,并且DOM基本上等待此结果加载数据。

    谢谢你们!

2 个答案:

答案 0 :(得分:2)

你是对的,ajax调用是异步的,因此是Asynchronous Javascript and XML。你可以让它同步,但你不应该因为你的阵列可供任何人玩,这可能会引起一些大的麻烦。

相反,在ajax调用完成后运行一个init调用。

function callback(records) {
  // do stuff with records.
}

$.getJSON(url, {id : recordid}, function(data) {

 var recordCollection = jQuery.parseJSON(JSON.stringify(data));
 callback(recordCollection); 
}); 

答案 1 :(得分:1)

Ajax代表Asynchronous JavaScript and XML(忘记XML部分)所以我认为你可以猜出什么是正确的;-)

我添加了带有注释的执行顺序:

var records = [] ;

// 1. send request and return immediately
$.getJSON(url, {id : recordid}, function(data) {

 // 3. response from server is received
 var recordCollection = jQuery.parseJSON(JSON.stringify(data));    
 $.each(recordCollection, function(){
  records.push(this);
 });
  console.log(records)
});  

// 2. print records
console.log(records); 

您不应尝试以任何方式使请求同步。如果您需要在数据可用后对records执行某些操作,则应创建一个新函数,并在将值推入records后调用它。