在节点js中执行for循环

时间:2014-04-10 08:44:08

标签: javascript node.js callback socket.io

在节点js中执行for循环后,我一直在尝试获取变量的值。但它显示为未定义。但是当我在5000ms之后调用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是一个全局变量,我在控制台中未定义。但是,当我把它     的setTimeout(()的函数      {          的console.log(sevenQues);      },5000);

我获得了理想的价值。请帮我解决这个问题,我听说有一些async.js文件可以执行foreach循环来发送所需的输出。但是我无法完成这件事。 Anyhelp将不胜感激。

1 个答案:

答案 0 :(得分: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)});
 }