2016-04-14 27 views
0

我创建了一个node.js服务器,现在正在尝试将我的mysql数据从表中发送到浏览器(使用JavaScript客户端接收数据)。如何通过套接字io连接每秒发送一个sql行?

我的问题是,如果我想从我的表中发送所有行,它工作正常,但如果我想每秒发送一行,它不起作用。

这是我在做什么: 服务器端:

io.on('connection', function (socket) { 

    for (var i = 1; i < 60; i++) { 
    connection.query('SELECT * FROM jsonlines WHERE id="'+i+'"').on('result', function(data) { 
     // Push results onto the notes array 
     var a= JSON.stringify(data); 
     notes.push(a); //I want to save each line in an array notes 

     setTimeout(function() { 
     socket.emit('news', notes[i]); 
     console.log(a); 
     }, (1 * 1000)); 
    }); 
    } 

}); 

所以basicaly我在我的表中的ID是为每个行不同,我选择行的for循环。 Settimeout用于执行1秒的延迟,以便socket.emit()仅在查询完成后1秒发送我的数据。

但是,console.log(a)以延迟打印我的所有行。

我在做什么错? 谢谢。

+0

你骑上任何异常? – Tomasito665

+0

@ Tomasito665,不,代码有效。问题是,当我在函数内部执行'console.log(a)'时,我立即得到了我的表的每个值,而没有任何1秒的延迟。 我会在我的问题中包括这一点。 –

+0

你可以尝试用这个替换你的代码:http://pastebin.com/e8EvP5rV什么'console.log(endTime - startTime);'输出?只是好奇,如果setTimeout甚至工作。 – Tomasito665

回答

0

你应该时刻记住,js是异步的。

这意味着您的循环for(var i=1;i<60;i++){将在setTimeout调用后继续循环。

所以为了延迟下一次电话应该等到上一次完成。

你可以试试这个尝试,只是看到了差距:

var i = 60; 
myFunc = function(socket) { 
    connection.query('SELECT * FROM jsonlines WHERE id="'+i+'"').on('result', function(data) { 
      var a= JSON.stringify(data); 
      notes.push(a); 

      socket.emit('news',notes[i]); 
      console.log(a); 

      i--; 
      console.log(i); 
      dt = new Date(); 
      console.log(dt.getMinutes()+':'+dt.getSeconds()); 
      if (i > 0) { 
       setTimeout(function(){myFunc(socket);}, 1000); 
      } 
    }); 

} 

io.on('connection', function (socket) { 
    myFunc(socket); 
}); 

另一种方法

var i = 60; 
var mySocket=''; 
myFunc = function() { 
    connection.query('SELECT * FROM jsonlines WHERE id="'+i+'"').on('result', function(data) { 
      var a= JSON.stringify(data); 
      notes.push(a); 

      mySocket.emit('news',notes[i]); 
      console.log(a); 

      i--; 
      console.log(i); 
      dt = new Date(); 
      console.log(dt.getMinutes()+':'+dt.getSeconds()); 
      if (i > 0) { 
       setTimeout(function(){myFunc();}, 1000); 
      } 
    }); 

} 


io.on('connection', function (socket) { 
    mySocket = socket; 
    myFunc(); 
}); 
+0

谢谢Alex。我认为你在正确的轨道上,但是如果你在'myFunc'中注意到''套接字'没有被定义,所以它不会像你编写它的方式那样工作。我会尝试修复它。 –

+0

所以,只需添加套接字作为参数 – Alex

+0

我做到了,但不幸的是,它现在不在控制台中打印任何内容 –

0

由于异步请求,所有的60个查询大致相同的完成时间(假设db连接和计算很好)。

试试这个:

io.on('connection', function (socket) { 

    for (var i = 1; i < 60; i++) { 
    connection.query('SELECT * FROM jsonlines WHERE id="'+i+'"').on('result', function(data) { 
     // Push results onto the notes array 
     var a= JSON.stringify(data); 
     notes.push(a); //I want to save each line in an array notes 

     setTimeout(function() { 
     socket.emit('news', a); // variable 'i' will be 60, you should use variable 'a' directly     
     console.log(a); 
     }, (i * 1000)); 
    }); 
    } 

});