一尘不染

如何确保正确的参数传递给循环中声明的函数调用?

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 + '" 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');
    });

}

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

我想念什么?


阅读 195

收藏
2020-07-07

共1个答案

一尘不染

这里的直接问题是,jkeyword变量在调用回调之前会不断变化。

一个简单的解决方案是在闭包中保护此变量:

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

当您仅使用简单数组时,还可以通过forEach以下方式使用闭包:

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

为了处理这种异步问题,您现在应该深入研究诺言,以更清晰(且缩进程度更小)的方式来构造代码。引言

2020-07-07