Node.js for() 루프에서 각 루프에서 동일한 값을 반환합니다.

저는 nodejs를 탐색하는 것을 돕기 위해 이 정말 간단한 어플리케이션을 만들고 있으며, 제 데이터베이스에 있는 상위 10개의 메시지를 기반으로 HTML 코드를 생성하는 특정 핸들러를 가지고 있습니다. 이 스니펫 I'는 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'의 루프 처리 방식 때문인 것 같습니다. 이것은 제가 읽었던 것 중 폐쇄와 관련된 것이고 이것은 제가 사용하려고 했던 것이거나 nodjs가 제 기능을 처리하는 비동기 방식 nodejs. 현재 10개의 결과는 DB에서 잘 반환되지만 마지막 메시지는 모든 루프에서 처리됩니다.

또한 var j = i 대신 value i를 함수 매개 변수로 사용하여 closure에 전달하려고 시도했지만 결과는 같았습니다.

문제를 해결하기 위해 중요한 지식을 놓치고 있다는 느낌이 드는데, 이 문제에 대해 좀 알 수 있을까요?

편집: 코드에 대한 다른 정보를 제공하는 것을 환영합니다. 전체 git repo를 게시합니다. 하지만 사람들은 아마도 이 문제를 디버깅하는 것을 돕기 위해 전체 프로젝트를 훑어보고 싶어하지 않을 것입니다. 그래서 저는 더 많은 컨텍스트를 제공하기 위해 전체 기능을 댓글에 올렸습니다.

해결책
  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)