Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js for()循环在每个循环中返回相同的值_Javascript_Node.js_Loops - Fatal编程技术网

Javascript Node.js for()循环在每个循环中返回相同的值

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

我制作这个非常简单的应用程序来帮助我探索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]);
          })();
  }
}
函数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,或者从等式中去掉正确作用域的复杂性。