Node.js for()循环在每个循环返回相同的值

时间:2012-04-19 18:56:23

标签: javascript node.js loops

我正在制作这个非常简单的应用程序来帮助我探索nodejs,并且我有一个特殊的处理程序,它根据我数据库中的top10消息生成HTML代码。该片段我遇到循环消息的问题,并调用生成HTML的函数并将结果附加到我的html字符串。

function CreateMessageboard(BoardMessages){
  var htmlMessageboardString = "";

  [... Console debug code ...]

  for(var i = 0; i < BoardMessages.length;i++){
        (function(){
            var j = i;
            console.log("Loading message %d".green, j);
            htmlMessageboardString += MessageToHTMLString(BoardMessages[j]);
          })();
  }
}

我认为我的问题是由于Javascript处理循环的方式,与我读取的闭包相关,这是我在上面尝试使用的,或者async方式nodejs处理我的函数。现在,10个结果从数据库中很好地返回,但是每个循环都会处理最后一条消息。

我也尝试过,而不是做var j = i,将值i作为函数参数并将其传递给闭包,它仍然返回相同的结果。

我有一种感觉,我缺少解决问题的批判性知识,我可以了解这件事吗?

编辑:我欢迎提供有关代码的任何其他信息,我会发布整个git repo但是人们可能不想游过整个项目来帮助我调试这个问题所以我发布了整个函数在评论中提供更多上下文。

2 个答案:

答案 0 :(得分:24)

  for(var i = 0; i < BoardMessages.length;i++){
        (function(j){
            console.log("Loading message %d".green, j);
            htmlMessageboardString += MessageToHTMLString(BoardMessages[j]);
        })(i);
  }

那应该有用;但是,您永远不应该在循环中创建函数。因此,

  for(var i = 0; i < BoardMessages.length;i++){
        composeMessage(BoardMessages[i]);
  }

  function composeMessage(message){
      console.log("Loading message %d".green, message);
      htmlMessageboardString += MessageToHTMLString(message);
  }

答案 1 :(得分:3)

我建议以更具功能性的方式来做这件事:P

function CreateMessageboard(BoardMessages) {
  var htmlMessageboardString = BoardMessages
   .map(function(BoardMessage) {
     return MessageToHTMLString(BoardMessage);
   })
   .join('');
}

试试这个