我的脚本通过 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 []
正如您在上面注意到的,我第二次将记录记录到控制台时,它产生了一个空数组,这使我得出两个结论:
Javascript 数组是按值传递的,因此回调函数范围之外的记录不会保留其值。
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/