我正在制作一个非常简单的应用程序来帮助我探索 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 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);
}