Reputation: 63619
I have a loop that querys a database continuously. When the query returns a result, the node.js app will send a message to every client connected to the node server via socket.io v0.8.
Problem: io.sockets.broadcast.send('msg')
is called in the middle of a setInterval()
loop so it is not within an io.sockets.on()
's callback function and thus this will not work. When io.sockets.send('msg')
is used, no message seems to be sent to the client.
Node.js code
setInterval(function() {
util.log('Checking for new jobs...');
dbCheckQueue(function(results) {
if (results.length) {
io.sockets.broadcast.send('hello');
}
});
}, 10*1000);
However, if the setInterval
is to be called from within io.sockets.on('connection',..)
, every connected client will create an additional loop!
Node.js code
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');
})
*How can I get a SINGLE loop to run, but still be able to send a message to all connected clients?
Upvotes: 28
Views: 16902
Reputation: 925
Improving previous answer from @Nyxynyx
io.sockets.emit('hello')
It is equivalent to:
io.of('/').emit('hello');
If you need a different route, change the of
function parameter.
Documentation: https://socket.io/docs/v3/server-api/index.html#server-sockets
Upvotes: 2
Reputation: 63619
I think that this will successfully solve your problem
io.sockets.emit('hello')
Upvotes: 40