在io.sockets.on()之外的socket.send

时间:2011-11-26 20:27:00

标签: javascript sockets node.js express socket.io

我有一个循环来连续查询数据库。当查询返回结果时,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循环,但仍然能够向所有连接的客户端发送消息?

2 个答案:

答案 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