我有一个循环来连续查询数据库。当查询返回结果时,node.js应用程序将通过socket.io v0.8向连接到节点服务器的每个客户端发送一条消息。
问题: io.sockets.broadcast.send('msg')
在setInterval()
循环的中间被调用,因此它不在io.sockets.on()
的回调函数中,因此不会工作。使用io.sockets.send('msg')
时,似乎没有消息发送到客户端。
Node.js代码
setInterval(function() {
util.log('Checking for new jobs...');
dbCheckQueue(function(results) {
if (results.length) {
io.sockets.broadcast.send('hello');
}
});
}, 10*1000);
但是,如果要从setInterval
内调用io.sockets.on('connection',..)
,则每个连接的客户端都会创建一个额外的循环!
Node.js代码
io.sockets.on('connection', function(socket) {
setInterval(function() {
util.log('Checking for new jobs...');
dbCheckQueue(function(results) {
if (results.length) {
io.sockets.send('hello');
}
});
}, 10*1000);
});
Clientside JS
socket.on('hello', function() {
console.log('HELLO received');
})
*我如何才能运行SINGLE循环,但仍然能够向所有连接的客户端发送消息?
答案 0 :(得分:26)
我认为这将成功解决您的问题
io.sockets.emit('hello')
答案 1 :(得分:0)
改善来自@Nyxynyx的先前答案
io.sockets.emit('hello')
等效于:
io.of('/').emit('hello');
如果您需要其他路由,请更改of
函数参数。
文档: https://socket.io/docs/v3/server-api/index.html#server-sockets