【问题标题】:How to ensure the right parameters is passed to a function call declared in a loop?如何确保将正确的参数传递给循环中声明的函数调用?
【发布时间】:2014-11-21 22:02:40
【问题描述】:

我是 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');
    });

}

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

我错过了什么?

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    这里最直接的问题是jkeyword 变量在回调被调用之前一直在变化。

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

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

    当您只使用简单数组时,您还可以通过forEach 使用闭包:

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

    要处理这种异步问题,您现在应该深入研究 Promise,它有助于以更清晰(且缩进更少)的方式构建您的代码。 An introduction.

    【讨论】:

    • 你可以使用bind作为替代
    • 工作就像一个魅力!谢谢!
    • 这可行,但不是出于上述原因,因为j 从未在闭包内使用。需要将 keyword 包装在嵌套函数范围内。
    • @MarceloCantos 在这种情况下,我发现保护循环变量更清晰、更易于维护。这是一种设计选择。
    • @rafaelcastrocouto,我会在改进代码时尝试这个,这似乎是一个更合乎逻辑的解决方案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多