Javascript:外部函数中的变量未被内部函数更改
我有一个小问题,我相信这可能是我对Javascript闭包的误解 我有一段代码-- 本质上,尽管getStdOptions调用中的内部函数('ok':函数…)将新值推送到VAL数组中,但从调用外部访问时,VAL数组为空。从内部函数中访问时,VAL包含预期的所有元素Javascript:外部函数中的变量未被内部函数更改,javascript,closures,Javascript,Closures,我有一个小问题,我相信这可能是我对Javascript闭包的误解 我有一段代码-- 本质上,尽管getStdOptions调用中的内部函数('ok':函数…)将新值推送到VAL数组中,但从调用外部访问时,VAL数组为空。从内部函数中访问时,VAL包含预期的所有元素 如果我能在这件事上得到任何帮助,我将不胜感激 我怀疑这是一个关闭/范围问题。如果this.srvs.getStdOptions是一个异步操作,那么getStdOpts将始终返回一个空数组。该数组将在操作完成后填充,正如所写的,这将在您
如果我能在这件事上得到任何帮助,我将不胜感激 我怀疑这是一个关闭/范围问题。如果
this.srvs.getStdOptions
是一个异步操作,那么getStdOpts
将始终返回一个空数组。该数组将在操作完成后填充,正如所写的,这将在您需要它之后填充。你将不得不以不同的方式处理事情。您需要直接将VAL
作为参数的回调传递到getStdOpts
中,并在this.srvs.getStdOptions
的匿名回调中执行该回调,或者需要返回某种类型的promise对象,您可以向其添加回调(本质上是将相同的vals
作为参数)根据需要--您必须在匿名回调中解析您的承诺,即将vals
作为其“承诺”结果。我怀疑这是一个闭包/作用域问题。如果this.srvs.getStdOptions
是一个异步操作,那么您的getStdOpts
总是会返回一个空数组。一旦操作完成,这个数组就会被填充,正如所写的那样,这将是在您需要它之后。您将不得不在有点不同。您需要直接将getStdOpts
作为参数的回调传递到vals
中,并在this.srvs.getStdOptions
的匿名回调中执行该回调,或者需要返回某种类型的promise对象,您可以向其添加回调(本质上是将相同的vals
作为参数)根据需要--您必须在匿名回调中解析您的承诺,即将vals
作为其“承诺”结果。getStdOptions
可能正在执行一些异步操作,否则就没有理由传递回调。例如,vals
在运行ok
函数之前返回。为了更好地帮助您,我们想知道这个.srvs.getStdOptions
在做什么。嗨,Felix,getStdOptions代码>函数调用后端数据服务,从给定的表中检索选项列表tbl
,该服务的部分响应将是状态ok和选项列表。您可能是对的,我没有想到服务检索操作可能是异步的。我将再次使用代码如果我能让它工作,请进来告诉你。谢谢你的帮助!:)getStdOptions
可能正在执行一些异步操作,否则就没有理由传递回调。例如,在运行ok
函数之前返回vals
。为了更好地帮助您,我们应该知道这个.srvs.getStdOptions
在做什么。您好,Felix,getStdOptions
函数n调用后端数据服务从给定的表tbl
中检索选项列表,该服务的部分响应将是状态ok和选项列表。您可能是对的,我没有考虑到服务检索操作可能是异步的。我将再次使用代码,然后让您知道你知道我是否能让它工作。谢谢你的帮助!:)
getStdOpts: function(tbl, filt) {
var vals = new Array();
this.srvs.getStdOptions(
{ tbl: tbl },
{
'ok': function(rsp) {
for (var i in rsp) {
vals.push({ value: rsp[i].id, text: rsp[i].descr });
}
}
}
);
return vals;
}