【问题标题】:How to send one sql row per second through a socket io connection?如何通过套接字 io 连接每秒发送一个 sql 行?
【发布时间】:2016-04-14 13:04:34
【问题描述】:

我创建了一个 node.js 服务器,现在正尝试将我的 mysql 数据从表发送到浏览器(使用 javascript 客户端接收数据)。

我的问题是,如果我想发送表中的所有行,它可以正常工作,但如果我只想每秒发送一行,它就行不通。

这就是我正在做的事情: 服务器端:

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));
    });
  }

 });

所以基本上我的表中有一个每行都不同的 id,并且我在 for 循环中选择行。 Settimeout 用于延迟 1 秒,以便 socket.emit() 仅在查询完成后 1 秒发送我的数据。

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

我做错了什么? 谢谢。

【问题讨论】:

  • 你有什么例外吗?
  • @Tomasito665,不,代码有效。问题是当我在函数内执行console.log(a) 时,我会立即获得表的每个值,没有任何 1 秒延迟。我会将其包含在我的问题中。
  • 您可以尝试用以下代码替换您的代码:pastebin.com/e8EvP5rVconsole.log(endTime - startTime); 输出什么?只是好奇 setTimeout 是否有效。
  • 你可能应该从你的问题中删除mysql标签,它主要是关于js本身。

标签: javascript mysql node.js socket.io


【解决方案1】:

您应该始终牢记 js 是异步的。

这意味着您的循环for(var i=1;i&lt;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();
}); 

【讨论】:

  • 谢谢亚历克斯。我认为你在正确的轨道上,但如果你注意到 myFunc socket 没有定义,所以它不会像你写的那样工作。我会尝试修复它。
  • 所以,只需添加套接字作为参数
  • 我做到了,但不幸的是它现在不会在控制台中打印任何内容
  • 您查看我更新的答案了吗?请发布您当前的代码。请记住,我无法调试您的代码,因为它依赖于数据和环境
【解决方案2】:

由于是异步请求,所有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));
    }); 
  }   

}); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 2010-12-30
    • 2019-06-12
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多