Подтвердить что ты не робот

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

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

Я также попытался вместо var j = я принять значение я в качестве параметра функции и передать его в закрытие, и он все равно вернул те же результаты.

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

Изменить: я могу предоставить любую другую информацию о коде, я бы опубликовал весь репортаж git, но люди, вероятно, не хотят проплывать через весь проект, чтобы помочь мне отладить эту проблему, поэтому я опубликовал вся функция в комментариях, чтобы предоставить больше контекста.

4b9b3361

Ответ 1

  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('');
}

Попробуйте это