如何在使用.execute()时向javascript中的回调函数传递附加参数?

如何在使用.execute()时向javascript中的回调函数传递附加参数?,javascript,function,callback,google-analytics,arguments,Javascript,Function,Callback,Google Analytics,Arguments,我正在为Google Analytics API使用javascript,但我只是JS方面的新手。我有C++和java知识,我可以和逻辑思维融洽相处,但有些事情让我困惑。在GA API中,我可以进行如下函数调用: gapi.client.analytics.data.ga.get({'ids':'<tableID>', 'start-date':'<startDate>', 'end-date':'<endDate>', 'metric

我正在为Google Analytics API使用javascript,但我只是JS方面的新手。我有C++和java知识,我可以和逻辑思维融洽相处,但有些事情让我困惑。在GA API中,我可以进行如下函数调用:

gapi.client.analytics.data.ga.get({'ids':'<tableID>',
    'start-date':'<startDate>',
    'end-date':'<endDate>',
    'metrics':'<metrics>',
    'filters':'<filters>',
    'samplingLevel':'HIGHER_PRECISION',}).execute(putToVar);
function putToVar(results,arrayDim)
{
    //Process Results
    //Store in Array[arrayDim] the required value
}
据我所知,
.execute()
方法用于调用异步调用的回调函数
gapi.client.analytics.data.ga.get()
。所以我假设
function1().execute(function2)
所做的是调用
function2
,并将
function1
的返回值作为参数?这是正确的吗

我需要应用几个不同的过滤器,并将它们存储在一个数组中,以便在需要时检索,而不管API调用是否返回了一个results对象(这是一个异步调用,所以我不知道响应何时出现,它只对回调函数可见)

我希望将存储返回对象的数组的维度传递给回调函数,以便以后可以根据需要检索它们,而不必担心处理响应的顺序。我这样说是因为,最初我尝试了一个
for
循环,我得到API调用响应的顺序与我为查询放置API调用的顺序不同,因此存在不匹配

由于引用使用此方法调用回调函数,因此我想知道如何在使用
.execute()
方法时向回调函数传递附加参数,当我开始编写
putToVar()
函数时,类似这样的内容:

gapi.client.analytics.data.ga.get({'ids':'<tableID>',
    'start-date':'<startDate>',
    'end-date':'<endDate>',
    'metrics':'<metrics>',
    'filters':'<filters>',
    'samplingLevel':'HIGHER_PRECISION',}).execute(putToVar);
function putToVar(results,arrayDim)
{
    //Process Results
    //Store in Array[arrayDim] the required value
}
我希望我已经讲清楚了。 我读过以下文章


但是他们似乎都没有使用
.execute()
方法,我也不知道如何使用他们所说的。或者,如果以及如何修改我的
.execute()
方法(回调执行类型)以帮助实现我的目的。

添加闭包可以解决您的问题:

for(var x = 0; x< n x ++){  //Or any other loop
   (function(x){   //Closure. This line does the magic!!
       var arrayDim = something_that_depends_on_x_or_the_loop,
           param2 = some_other_thing_that_depends_on_x;
       gapi.client.analytics.data.ga.get({'ids':'<tableID>',
         'start-date':'<startDate>',
          ...
       }).execute(function putToVar(results){   //this fn is defined inline to get access to param1, param2
           //The following alerts will use the *correct* variables thanks to the closure
           alert(x);
           alert(arrayDim);
           alert(param2);
       });
   })(x); //This one too
}
(var x=0;x (函数(x){//闭包。这行代码很神奇!! var arrayDim=依赖于或循环的东西, param2=依赖于x的其他事物; gapi.client.analytics.data.ga.get({'id':'', “开始日期”:“, ... }).execute(函数putToVar(results){//此fn是内联定义的,用于访问param1、param2 //由于关闭,以下警报将使用*正确*变量 警报(x); 警报(arrayDim); 警报(参数2); }); })(x) 这个也是 } 闭包起了神奇的作用。它将允许每个循环都有自己的变量(不共享),因此当执行时,适当的变量将在
putToVar

我希望这是清楚的,如果没有,请告诉我

试试看


干杯,来自玻利维亚拉巴斯

添加一个关闭将解决您的问题:

for(var x = 0; x< n x ++){  //Or any other loop
   (function(x){   //Closure. This line does the magic!!
       var arrayDim = something_that_depends_on_x_or_the_loop,
           param2 = some_other_thing_that_depends_on_x;
       gapi.client.analytics.data.ga.get({'ids':'<tableID>',
         'start-date':'<startDate>',
          ...
       }).execute(function putToVar(results){   //this fn is defined inline to get access to param1, param2
           //The following alerts will use the *correct* variables thanks to the closure
           alert(x);
           alert(arrayDim);
           alert(param2);
       });
   })(x); //This one too
}
(var x=0;x (函数(x){//闭包。这行代码很神奇!! var arrayDim=依赖于或循环的东西, param2=依赖于x的其他事物; gapi.client.analytics.data.ga.get({'id':'', “开始日期”:“, ... }).execute(函数putToVar(results){//此fn是内联定义的,用于访问param1、param2 //由于关闭,以下警报将使用*正确*变量 警报(x); 警报(arrayDim); 警报(参数2); }); })(x) 这个也是 } 闭包起了神奇的作用。它将允许每个循环都有自己的变量(不共享),因此当执行时,适当的变量将在
putToVar

我希望这是清楚的,如果没有,请告诉我

试试看


干杯,来自玻利维亚拉巴斯

我在哪里可以读到更多关于闭包的内容?谷歌是压倒性的,问你是否可以更具体。如果你能得到一本书“Javascript,好的部分”,它有很好的解释。这里有一个有用的链接:嗯,我还没有测试它。实际上我正在吃早餐。很快就可以了。:)在哪里可以阅读更多关于闭包的信息?谷歌是压倒性的,问你是否可以更具体。如果你能得到一本书“Javascript,好的部分”,它有很好的解释。这里有一个有用的链接:嗯,我还没有测试它。实际上我正在吃早餐。很快就可以了。:)