我的脚本通过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为真,我该如何初始化记录数组?
如果2为真,我应该让这个Ajax调用同步吗?这将使javascript阻塞,直到返回值,因此第二次记录数组记录到控制台,它将显示数组的更新值?
第三是我完全错过了一个技巧,并在这里做了一些非常愚蠢的事情。
我确实需要使用从ajax调用返回的数据来设置记录数组,因为它需要传递给脚本中的不同javascript函数,并且DOM基本上等待此结果加载数据。
谢谢你们!
答案 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
后调用它。