【问题标题】:execute a for loop in node js在节点js中执行一个for循环
【发布时间】:2014-05-23 20:41:17
【问题描述】:

我一直在尝试在节点 js 中执行 for 循环后获取变量的值。但它显示为未定义。但是当我在 5000 毫秒后调用 setTimeout 函数中的变量时,相同的变量正在获得所需的值。我不想使用 setTimeout,因为它因使用我的应用程序的用户而异。

我正在尝试的代码是

function getQuestions()
 {
  for(x=0;x<sevenQIDs.length;x++)
   {
    var query = connection.query('SELECT QUESTION, OP1, OP2, OP3, OP4, ANS FROM QUESTIONS WHERE QUESTION_ID="'+sevenQIDs[x]+'"', function(err,result,fields){
    if(err){
      throw err;    
    } 
    else{
      var a = result[0];
      var resTime = [], resAns = [];
      resTime.length = 5;
      resAns.length = 5;
      a.resTime = resTime;
      a.resAns = resAns;
      sevenQues.push(a);
     }
   });
 }
}

socket.on('socket1', function(text) 
 {
   getQuestions();
   console.log(sevenQues);
 }

这里的 SevenQues 是一个全局变量,我在控制台中没有定义。但是当我把这个 设置超时(函数() { 控制台.log(sevenQues); },5000);

我得到了想要的价值。请帮我解决这个问题,我听说有一些 async.js 文件可以执行 foreach 循环来发送所需的输出。但我无法完成这项工作。任何帮助将不胜感激。

【问题讨论】:

  • 经典。是异步调用,你需要使用回调来确保你在最后一次推送后访问sevenQues

标签: javascript node.js callback socket.io


【解决方案1】:

试试这个:

function getQuestions(callback)
 {
  for(x=0;x<sevenQIDs.length;x++)
   {
    var query = connection.query('SELECT QUESTION, OP1, OP2, OP3, OP4, ANS FROM QUESTIONS WHERE QUESTION_ID="'+sevenQIDs[x]+'"', function(err,result,fields){
    if(err){
      throw err;    
    } 
    else{
      var a = result[0];
      var resTime = [], resAns = [];
      resTime.length = 5;
      resAns.length = 5;
      a.resTime = resTime;
      a.resAns = resAns;
      sevenQues.push(a);
      if(x == sevenQIDs.length-1) callback();
     }
   });
 }
}

socket.on('socket1', function(text) 
 {
   getQuestions(function(){console.log(sevenQues)});
 }

【讨论】:

  • Thanx,但是对于每个 for 循环查询,回调会显示 7 次,我只需要由 7 个问题组成的最终结果。
  • 然后将其置于 if 条件中并在最后一次迭代中调用它。
  • Thanx,但在 if 条件下,循环被执行了 7 次,即我的 x 值为 7,因为有任何方法可以控制它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
相关资源
最近更新 更多