13

我正在制作这个非常简单的应用程序来帮助我探索 nodejs,并且我有一个特定的处理程序,它可以根据我的数据库中的前 10 条消息生成 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处理循环的方式,与我读到的闭包有关,这是我在上面尝试使用的,或者是nodejs处理我的函数的异步方式。现在从数据库很好地返回了 10 个结果,但最后一条消息在每个循环中处理。

我也试过,而不是做 var j = i,取值 i 作为函数参数并将它传递到闭包中,无论如何它返回了相同的结果。

我有一种感觉,我缺少解决问题的关键知识,我可以了解一下这个问题吗?

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

4

2 回答 2

25
  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);
  }
于 2012-04-19T19:45:40.303 回答
3

我建议以更实用的风格来做这件事:P

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

试试这个

于 2012-04-19T19:36:31.983 回答