使用.execute()时如何在javascript中将其他参数传递给回调函数?

时间:2014-01-09 04:05:46

标签: javascript function callback google-analytics arguments

我正在使用javascript for Google AnalyticsAPI但我不过是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);

putToVar()是一个用户定义的函数,定义如下:

function putToVar(results)
{
    //do processing with the results
}

据我了解,.execute()方法用于为异步调用gapi.client.analytics.data.ga.get()调用回调函数。所以我假设function1().execute(function2)所做的是调用function2并将function1的返回值作为参数?这是对的吗?

我遇到的情况是我需要应用几个不同的过滤器并将它们存储在一个数组中,以便在需要时检索,无论API调用是否返回结果对象(它是异步调用,所以我不喜欢不知道响应何时到来,它只对回调函数可见。

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

由于引用使用此方法来调用回调函数,我想知道如何在使用.execute()方法时将其他参数传递给回调函数,当我编写putToVar()时功能如下:

function putToVar(results,arrayDim)
{
    //Process Results
    //Store in Array[arrayDim] the required value
}

我希望我已经说清楚了。 我已阅读以下帖子

但他们似乎都没有使用.execute()方法,我无法弄清楚如何使用他们所说的内容。或者,是否以及如何修改我的.execute()方法(回调执行的类型)以帮助我实现目的。

1 个答案:

答案 0 :(得分:4)

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

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
}

关闭是神奇的。它将允许每个循环周期具有自己的变量(不共享),因此正确的变量将在执行时位于putToVar内。

我希望很清楚,如果没有,请告诉我。

试试吧!

来自玻利维亚拉巴斯的欢呼声