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, но люди, вероятно, не хотят проплывать через весь проект, чтобы помочь мне отладить эту проблему, поэтому я опубликовал вся функция в комментариях, чтобы предоставить больше контекста.
Ответы
Ответ 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('');
}
Попробуйте это