Javascript 从使用google.script.run的嵌套函数中获取变量

Javascript 从使用google.script.run的嵌套函数中获取变量,javascript,nested-function,Javascript,Nested Function,我相信我很快就能解决这个问题了。我做了一些研究,并不断发现一些例子,说明我可以在嵌套函数中使用局部变量,但在另一方面只能使用一些东西(从嵌套函数中获取变量)。除此之外,我还与google.script.run.withSuccessHandler()合作,这让事情变得混乱(或者至少让我感到困惑) 我需要把xRates取回来,这样我就可以在函数“updateSidebarValues”中使用它了。我曾尝试过使用闭包,但在添加withSuccessHandler元素时,我真的不明白如何使用闭包 我写

我相信我很快就能解决这个问题了。我做了一些研究,并不断发现一些例子,说明我可以在嵌套函数中使用局部变量,但在另一方面只能使用一些东西(从嵌套函数中获取变量)。除此之外,我还与google.script.run.withSuccessHandler()合作,这让事情变得混乱(或者至少让我感到困惑)

我需要把xRates取回来,这样我就可以在函数“updateSidebarValues”中使用它了。我曾尝试过使用闭包,但在添加withSuccessHandler元素时,我真的不明白如何使用闭包

我写了以下内容:(这是错误的,但我必须接近?)


我的警报有效。。。它显示了我的代码文件的正确结果。。。但是当我稍后尝试使用xRates时,告诉我它的未定义:(

答案很简单,这里:
函数RatesGetter(xRates){…}
xRates
是函数的一个参数,您只能在这个方法中访问它。它将在
回调(xRates)
中传递,但在您编写的地方无法访问它“…用xRates做其他事情”

实际上,你不仅仅是一个范围问题。
google.script.run.withSuccessHandler()
似乎是异步的,因此它得到的结果不会发生在同一个事件循环中。因此,即使您可以解决范围问题,您也会尝试在定义值之前访问这些值。您可以创建另一个函数并从回调中调用它。例如:

function updateSidebarValues(salesTotals) {

    var valueToPass = document.getElementById('reportSelect').value;
    google.script.run.withSuccessHandler(RatesGetter).getXrates(valueToPass);

    function RatesGetter(xRates) {
        alert('YAY!!!! This is the variable we need from Code.gs : ' + xRates);
        doOtherStuff(xRates)
    }
    function doOtherStuff(xRates) {
        //… Do other stuff with xRates
    }
}

或者,您也可以在
RatesGetter()

中正确地执行其他操作
callback()在哪里
来自于?@Luca oops,这是另一个实验中留下的-我已经编辑并删除了。谢谢……那么……你是说从嵌套函数中获取数据是不可能的吗?@DavidTonkin,只有嵌套函数返回数据,你才能这样做。据我所知,你想将
xRates
传递给嵌套函数and返回
newXRates
并进一步使用它?不需要将xRates传递给嵌套函数,它来自于我的code.gs。我实际上只有嵌套函数,因为我发现从code.gs获取变量到客户端的示例就是这样做的……这都是在做其他事情的更大函数内部……我需要的是我开始使用的主要功能是从code.gs获取xRates,然后继续执行它必须执行的所有其他操作。。。
function updateSidebarValues(salesTotals) {

    var valueToPass = document.getElementById('reportSelect').value;
    google.script.run.withSuccessHandler(RatesGetter).getXrates(valueToPass);

    function RatesGetter(xRates) {
        alert('YAY!!!! This is the variable we need from Code.gs : ' + xRates);
        doOtherStuff(xRates)
    }
    function doOtherStuff(xRates) {
        //… Do other stuff with xRates
    }
}