Javascript:外部函数中的变量未被内部函数更改

Javascript:外部函数中的变量未被内部函数更改,javascript,closures,Javascript,Closures,我有一个小问题,我相信这可能是我对Javascript闭包的误解 我有一段代码-- 本质上,尽管getStdOptions调用中的内部函数('ok':函数…)将新值推送到VAL数组中,但从调用外部访问时,VAL数组为空。从内部函数中访问时,VAL包含预期的所有元素 如果我能在这件事上得到任何帮助,我将不胜感激 我怀疑这是一个关闭/范围问题。如果this.srvs.getStdOptions是一个异步操作,那么getStdOpts将始终返回一个空数组。该数组将在操作完成后填充,正如所写的,这将在您

我有一个小问题,我相信这可能是我对Javascript闭包的误解

我有一段代码--

本质上,尽管getStdOptions调用中的内部函数('ok':函数…)将新值推送到VAL数组中,但从调用外部访问时,VAL数组为空。从内部函数中访问时,VAL包含预期的所有元素


如果我能在这件事上得到任何帮助,我将不胜感激

我怀疑这是一个关闭/范围问题。如果
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;
}