Цикл Node.js for(), возвращающий одни и те же значения в каждом цикле

Я делаю очень простое приложение для изучения nodejs, и у меня есть определенный обработчик, который генерирует HTML код на основе топ10 сообщений в моей базе данных. Сниппет, с которым у меня проблемы, перебирает сообщения, вызывает функцию, генерирующую 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 в качестве параметра функции и передать его в закрытие, но оно все равно вернуло те же результаты.

У меня такое чувство, что мне не хватает критических знаний для решения моей проблемы, могу ли я получить свет на этот вопрос?

Edit : Я'рад предоставить любую другую информацию о коде, я'бы выложил весь 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)