我创建了一个 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/