javascript - 如何通过套接字io连接每秒发送一行sql?

标签 javascript mysql node.js socket.io

我创建了一个 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) 立即打印我的所有行,但有延迟。

我做错了什么? 谢谢。

最佳答案

你应该永远记住 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();
}); 

关于javascript - 如何通过套接字io连接每秒发送一行sql?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36624011/

相关文章:

javascript - Js。显示数组元素

php - 我的 php 生成的电子邮件没有显示我数据库中的所有记录

php - MySQL- 为什么 LAST_INSERT_ID() 对我不起作用?

node.js - 在 ExpressJS 中使用带有 FontAwesome 的 Twitter Bootstrap

javascript - 在 NestJS 模块中使用配置服务的最佳实践

javascript - json - 一次在同一个 Node 上添加 2 个元素? (或者在不存在的 Node 中)

javascript - 为什么带有选项的 Intl.NumberFormat 在左侧输出欧元符号,而文档说它应该在右侧?

Javascript 重复字母 X 次

javascript - 如何在 PHP 中用字符串回显警报——单引号和双引号的一些混淆

php - SQL查询有两个条件,更新匹配的一个