2

我的脚本通过 jQuery 发出 Ajax 请求。接收到的数据通过服务器端脚本 (php) 进行 json_encoded。这进一步,字符串化,然后使用 jQuery 解析 JSON 以产生一个记录集合。我循环遍历 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 调用完成之前记录记录,因此它仍然保留空的未初始化记录数组的值并将其记录到控制台上。

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

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

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

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

多谢你们!

4

2 回答 2

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); 
}); 
于 2012-12-24T21:06:35.300 回答
1

Ajax 代表异步 JavaScript 和 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.

于 2012-12-24T21:06:04.040 回答