Javascript 如何确保将正确的参数传递给循环中声明的函数调用?
我不熟悉node,但我已经喜欢它了。唯一的问题是,异步功能正在折磨我 我正在使用google软件包获取我的网站在google中的排名,如下所示:Javascript 如何确保将正确的参数传递给循环中声明的函数调用?,javascript,node.js,Javascript,Node.js,我不熟悉node,但我已经喜欢它了。唯一的问题是,异步功能正在折磨我 我正在使用google软件包获取我的网站在google中的排名,如下所示: for (var j=0;j<keywords.length;j++) { var keyword = keywords[j]; google(keyword, function(err, next, links) { console.log('Searching for keyword "' + keyword +
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');
});
}
for(var j=0;j这里的直接问题是j
和关键字
变量在调用回调之前不断变化
一个简单的解决方案是在闭包中保护此变量:
for (var j=0; j<keywords.length; j++) {
(function(j){
var keyword = keywords[j];
...
})(j);
}
要处理这类异步问题,您现在应该专注于承诺,这些承诺有助于以更清晰(且更少缩进)的方式构造代码。这里的直接问题是,j
和关键字
变量在调用回调之前不断变化
一个简单的解决方案是在闭包中保护此变量:
for (var j=0; j<keywords.length; j++) {
(function(j){
var keyword = keywords[j];
...
})(j);
}
为了处理这种异步问题,您现在应该深入研究有助于以更清晰(且更少缩进)的方式构造代码的承诺way..你可以用它作为一个替代品,就像一个符咒一样工作!谢谢!这是有效的,但不是出于说明的原因,因为j
从来没有在闭包中使用过。它是关键字
,需要包装在嵌套的函数作用域中。@Marcelocontos在这种情况下,我发现它更清晰,更易于维护,以保护循环变量能行。这是一个设计选择。@rafaelcastrocouto,我会在改进代码时尝试一下,这似乎是一个更符合逻辑的解决方案。谢谢。你可以用它作为替代品。像符咒一样工作!谢谢!这很有效,但不是出于说明的原因,因为j
从未在闭包中使用过。需要在闭包中包装的是关键字
嵌套函数作用域。@Marcelocontos在本例中,我发现保护循环变量更清晰、更易于维护。这是一种设计选择。@rafaelcastrocouto,我会在改进代码时尝试一下,这似乎是一种更符合逻辑的解决方案。谢谢。