我有下面的Javascript函数,它应该返回数据库中的组的数组。它使用$.getJSON()方法调用get_groups.php,实际上是从数据库中读取数据。
function get_groups() {
var groups = [];
$.getJSON('get_groups.php', function(response) {
for (var i in response) {
groups.push(response[i]);
}
}
return groups;
}不幸的是,这个函数没有像预期的那样工作,因为groups.push(response[i]);没有填充var groups = []; (据我所知,它填充了一些其他的groups数组,可能是全局数组)。
假设我不想有一个全局groups变量,您将如何解决这个问题?
发布于 2010-08-17 18:47:21
这真的不是范围问题,而是$.getJSON()是异步的,这意味着这部分会在你返回后运行:
for (var i in response) {
groups.push(response[i]);
}您需要在异步请求的回调中调用需要此数据的任何函数,以便在数据可用时运行,如下所示:
$.getJSON('get_groups.php', function(response) {
var groups = [];
for (var i in response) {
groups.push(response[i]);
}
doSomethingThatNeedsGroups(groups);
});当前正在填充您的组数组,但不是在需要的时候。如果您一定要返回它(我强烈建议按预期的方式使用异步模型),您可以使用完整的$.ajax()版本并设置async:false。再说一次……如果可能的话,不要走这条路,只要数据可用,就坚持调用任何需要的函数,因为async: false会锁定用户的浏览器。
发布于 2010-08-17 18:46:27
除非您真的有一个名为groups的全局变量(实际上这不是最好的想法),否则您就是在与您的“局部”groups变量对话。
由于EMCA-/Javascript确实具有函数作用域,并且您在那里使用的是闭包,因此您确实可以访问该变量。所以这里的问题不在于作用域。,,所以即使有一个具有完全相同名称的全局变量,所谓的词法作用域也会保证你可以访问你的局部变量。,,。
实际问题是,return groups在$.getJSON()完成之前就执行了。因为它创建了一个ajax请求,所以它是异步运行的。
您应该自己使用callback来处理数据:
function get_groups(cb) {
var groups = [];
$.getJSON('get_groups.php', function(response) {
for (var i in response) {
groups.push(response[i]);
}
cb.apply(null, [groups]);
}
}
get_groups(function(groups){
// do something with groups array
});发布于 2010-08-17 18:49:20
"$.getJSON('get_groups.php',function(response) {“是一个回调函数。
groups-Array中的更改会在回调和返回groups之后生效。
"get_groups"
您不能直接返回回调函数的修改。
https://stackoverflow.com/questions/3501547
复制相似问题