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

标签 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 调用完成之前记录记录,因此它仍然保留空的未初始化记录数组的值并将其记录到控制台上。

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

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

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

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

谢谢大家!

最佳答案

您是对的,ajax 调用是异步的,因此异步 Javascript 和 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); 
}); 

关于javascript - 初始化在 jQuery $.getJSON 回调函数外部声明的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14025628/

相关文章:

javascript - 如何在第一次加载应用程序时显示加载指示器

javascript - 加载/包含内容的最佳方式? (jQuery 的 load() 与 PHP 的 include())

javascript - 调用未定义函数 where() laravel

ruby-on-rails - 基于 Ajax 的 Web 应用程序和身份验证 : session or token?

javascript - 为什么 jQuery 返回数据没有按预期工作?

javascript - 检测到滚动时的 ScrollTop

javascript - 如何在 PixelAdmin 模板中将 select2 依赖插件更新到版本 4.0.6

javascript - 您如何使用方法绑定(bind)和 url 将任何 src 图像从一侧复制到另一侧?

javascript - 使用 Meteor 中的 Javascript 事件在多个预设字段之间切换 MongoDB 文档

php - 通过 jQuery 将变量传递给 PHP 文件