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

Tri*_*ubé 13 javascript loops node.js

我正在制作这个非常简单的应用程序来帮助我探索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]);
          })();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑:我欢迎提供代码的任何其他信息,我发布了整个git repo但人们可能不想游泳整个项目来帮助我调试这个问题所以我发布了整个函数评论提供更多背景信息.

Joe*_*Joe 25

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

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

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

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

  • 只要正确完成范围设定,在循环中创建匿名函数没有任何问题. (3认同)