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

我正在使这个非常简单的应用程序来帮助我探索nodejs,并且我有一个特定的处理程序,它根据数据库中的top10消息生成HTML代码。 我有问题循环通过消息的代码段,并调用生成HTML的函数,并将结果附加到我的HTMLstring。

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处理循环的方式,与我读的closures有关,这是我上面尝试使用的或asynchronous方式nodejs处理我的function。 现在10个结果很好的从数据库返回,但最后的消息在每个循环处理。

我也尝试过,而不是做var j = i,把value作为函数参数,并在闭包中传递它,它返回相同的结果。

我有一种感觉我错过了解决我的问题的重要知识,我可以在这个问题上得到启发吗?

编辑:我欢迎给任何其他信息的代码,我会发布整个git回购,但人们可能不希望游泳通过整个项目来帮助我debugging这个问题,所以我发布了整个function评论提供更多的上下文。

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

这应该工作; 然而,你不应该在循环中创build一个函数。 因此,

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

我build议以更实用的方式来做这件事:P

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

尝试这个