Node.jsのfor()ループがループ毎に同じ値を返すこと

私は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件の結果はDBからうまく返されていますが、最後のメッセージは各ループで処理されています。

私はまた、var j = iを行う代わりに、関数パラメータとして値iを取り、それをクロージャに渡すことを試みましたが、それはとにかく同じ結果を返しました。

私は私の問題を解決するための重要な知識を欠いているような気がします。

Edit : コードに関する他の情報を提供するのは歓迎します。

質問へのコメント (5)
ソリューション
  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);
  }
解説 (2)

より機能的なスタイルで行うことをお勧めします :P

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

これを試してみてください

解説 (0)