我有以下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
数组,可能是全局数组。) p>
假设我不想拥有全局groups
变量,您将如何解决此问题?
答案 0 :(得分:5)
这不是范围问题,事实上$.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
会锁定用户的浏览器。
答案 1 :(得分:1)
除非你真的有一个名为groups
的全局变量(实际上这不是最好的主意),否则你正在与你的“本地”groups
变量进行对话。
由于EMCA- / Javascript确实具有功能范围,并且您在那里使用闭包,因此您可以访问该变量。所以这里的问题,不是范围。 因此,即使使用具有完全相同名称的全局变量,这样的被称为词法范围也将保证您可以访问本地变量。
确实问题是return groups
在$.getJSON()
完成之前执行。由于它创建了一个ajax请求,因此它运行asynch。
您应该自己使用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
});
答案 2 :(得分:0)
“$。getJSON('get_groups.php',function(response){”是一个回调函数。
在回调被trickerd之后以及返回组之后,groups-Array中的更改会受到影响。
你无法直接返回回调函数的修改。