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 リポジトリ全体を投稿しますが、この問題のデバッグを支援するためにプロジェクト全体を泳ぎたくないので、関数全体をより多くのコンテキストを提供するコメント。

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 に答える