Javascript Node.js for()循环在每个循环中返回相同的值
我制作这个非常简单的应用程序来帮助我探索nodejs,我有一个特殊的处理程序,它根据数据库中的前10条消息生成HTML代码。我遇到问题的代码段循环消息,调用生成HTML的函数,并将结果附加到我的HTML字符串中Javascript Node.js for()循环在每个循环中返回相同的值,javascript,node.js,loops,Javascript,Node.js,Loops,我制作这个非常简单的应用程序来帮助我探索nodejs,我有一个特殊的处理程序,它根据数据库中的前10条消息生成HTML代码。我遇到问题的代码段循环消息,调用生成HTML的函数,并将结果附加到我的HTML字符串中 function CreateMessageboard(BoardMessages){ var htmlMessageboardString = ""; [... Console debug code ...] for(var i = 0; i < BoardMes
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]);
})();
}
}
函数CreateMessageboard(BoardMessages){
var htmlMessageboardString=“”;
[…控制台调试代码…]
对于(变量i=0;i
我认为我的问题是由于Javascript处理循环的方式,与我读到的闭包相关,这就是我在上面尝试使用的方式,或者是nodejs处理函数的异步方式。现在,10个结果很好地从数据库返回,但最后一条消息在每个循环中都会得到处理
我还尝试了,而不是使用var j=I,将值I作为函数参数,并将其传递到闭包中,结果还是一样的
我觉得我缺少解决问题的关键知识,我能了解这件事吗
编辑:欢迎提供关于代码的任何其他信息,我会发布整个git repo,但人们可能不想浏览整个项目来帮助我调试这个问题,所以我在评论中发布了整个函数,以提供更多的上下文。我建议以更具功能的方式进行此操作:p
function CreateMessageboard(BoardMessages) {
var htmlMessageboardString = BoardMessages
.map(function(BoardMessage) {
return MessageToHTMLString(BoardMessage);
})
.join('');
}
为(var i=0;i for(var i = 0; i < BoardMessages.length;i++){
(function(j){
console.log("Loading message %d".green, j);
htmlMessageboardString += MessageToHTMLString(BoardMessages[j]);
})(i);
}
(职能(j){
日志(“正在加载消息%d”。绿色,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);
}
for(变量i=0;i
即使没有函数,它也应该可以工作,因为您没有任何其他可能无意中捕获i
的闭包。这就是你的密码吗?正如@MatthewFlaschen所说,密码看起来不错。但是,您可以尝试函数(i){……})(i)
这样就毫无疑问地捕获了i
;错误似乎不在这里,这里是函数和控制台输出的完整代码,一些MySQL输出来自我的MySQL模块。我非常怀疑这个错误在别的地方,但我仍会继续检查。这组未定义的结果是正常的,因为我在默认情况下使用用户id 0发布消息时犯了一个小错误,而我没有这样的用户,最后一条消息是使用此默认用户发布的,并且它是每个循环重复的。@Leroux,请让代码输出最终的HTML。将MessageToHTMLString(BoardMessages[messageNumber])
放入一个临时变量中,并在连接之前输出该变量,可能会有所帮助。在这些更改之后,您能再次发布代码和控制台输出吗?在循环中创建匿名函数没有什么错,只要作用域正确完成。@MatthewFlaschen,或者从等式中去掉正确作用域的复杂性。