我正在尝试使用请求包发出请求,但似乎无法通过简单的参数传递。
任何人都知道传递它的最佳方法是什么?
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
答案 0 :(得分:1)
您的问题是由for
循环和异步请求的组合引起的。发生的事情是你的循环开始,然后开始第一个请求。请求是异步的(因为它已经超过了互联网)。这意味着回调中的代码不会立即执行,它将被“跳过”直到异步请求返回。重要的是你的for
循环继续执行,递增k和踢新请求。现在你的代码已经完成,除了回调两个请求。
现在第一个回来了。它执行回调中的代码。 k
的价值是多少?好了,因为循环继续,值现在是1
。第二个请求也是如此,k
仍然是1
。
重要的是,回调不会创建它自己只能触及的上下文。
有三种方法:找出一种不在for循环中放置async
操作,使用async
库或了解闭包的方法(阅读3个不同的解释)对这个有一个很好的直觉。)