如何确保正确的parameter passing给循环中声明的函数调用?

我是新来的节点,但我已经喜欢它了。 唯一的问题是,asynchronousfunction正在杀死我。

我正在使用谷歌包来获得我的网站在谷歌的排名如此:

for (var j=0;j<keywords.length;j++) { var keyword = keywords[j]; google(keyword, function(err, next, links) { console.log('Searching for keyword "' + keyword + '" in google.' + google.tld + ' ('+ google.lang +')'); if (err) console.error(err); for (var i = 0; i < links.length; ++i) { var rank = i+1; console.log(keyword + ' #'+ rank + ' - ' + links[i].link + ' | ' + links[i].title); //link.href is an alias for link.link //console.log(links[i].description + "\n"); } console.log('\n'); }); } 

我的问题是,控制台日志显示所有网站相同的关键字,虽然我已经在我的关键字数组中定义了三个。

我错过了什么?

这里直接的问题是,在调用callback之前, jkeywordvariables会改变。

一个简单的解决scheme是在封闭中保护这个variables:

 for (var j=0; j<keywords.length; j++) { (function(j){ var keyword = keywords[j]; ... })(j); } 

当你只使用一个简单的数组时,你也可以通过forEach使用闭包:

 keywords.forEach(function(keyword, j){ ... }); 

为了处理这种asynchronous问题,你现在应该潜入承诺中,这样可以帮助你以更清晰的方式构build你的代码。 介绍 。