参数未通过NodeJ中的Request传递

时间:2016-05-24 22:07:21

标签: javascript node.js

我正在尝试使用请求包发出请求,但似乎无法通过简单的参数传递。

任何人都知道传递它的最佳方法是什么?

asyncRefreshToken()
  .then(function(token){
    console.log('Got the token! ' + token);
    for(var k=0; k<2; k++){
      var url= 'https://www.googleapis.com/analytics/v3/data/realtime?ids=ga:'+brandsConfig.brands[k].profileId+'&metrics=rt%3AactiveUsers&dimensions=rt%3ApagePath&sort=-rt%3AactiveUsers&access_token='+token;
      var options = {
        url: url,
        method: 'GET'
      }
      request(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
          // Print out the response body
          var parsed = JSON.parse(body);
          var activeUsers = parsed.totalResults;
          console.log(brandsConfig.brands[k].title + ': ' + activeUsers);
        }
      })
    }
  })

对不起,我应该更具体 - brandsConfig.brands [k] .title只返回最后一个值,即brandsConfig.brands [1] .title

我想要实现的目标:

  • 获取令牌后(来自asyncRefreshToken),请使用请求包查询Google AnalyticsAPI以获取品牌列表。

  • 品牌有阵列品牌.Config.brands [k],相应的标题可以从brandsConfig.brands [k] .title

  • 获得。
  • 现在的结果,在我试图学习的时候,可以在控制台中。

  • 理想的结果:

    * Got the token! 1234567890
    * Brand 1 : 582432
    * Brand 2 : 523423
    
  • 当前输出:

    * Got the token! 1234567890
    * Brand 2 : 582432
    * Brand 2 : 523423
    

1 个答案:

答案 0 :(得分:1)

您的问题是由for循环和异步请求的组合引起的。发生的事情是你的循环开始,然后开始第一个请求。请求是异步的(因为它已经超过了互联网)。这意味着回调中的代码不会立即执行,它将被“跳过”直到异步请求返回。重要的是你的for循环继续执行,递增k和踢新请求。现在你的代码已经完成,除了回调两个请求。

现在第一个回来了。它执行回调中的代码。 k的价值是多少?好了,因为循环继续,值现在是1。第二个请求也是如此,k仍然是1

重要的是,回调不会创建它自己只能触及的上下文。

有三种方法:找出一种不在for循环中放置async操作,使用async库或了解闭包的方法(阅读3个不同的解释)对这个有一个很好的直觉。)