Node.js的setInterval不起作用

4

使用node.js,我正在尝试以每秒钟的频率将当前的server_time发送给所有客户端。因此,我想使用setInterval()向所有客户端发出事件并发送时间,但它无法正常工作。我在正确的位置定义了setInterval函数吗?或者我遗漏了其他东西吗?

var http = require("http");
var socketIO = require('socket.io');
var connect = require('connect');

//keep track of every connected client
var clients = {};

//create Server 
var httpServer = connect.createServer(
    connect.static(__dirname)
).listen(8888);


//socket
var io = socketIO.listen(httpServer);
io.sockets.on('connection', function (socket) {

    //add current client id to array
    clients[socket.id] = socket;
    socket.on('close', function() {
        delete clients[socket.fd]; // remove the client.
    });

    //send news on connection to client
    socket.emit('news', { hello: 'world' }); 

    //this one works fine!
    //send server time on connection to client
    socket.emit("server_time", { time: new Date().toString() });

});

//this doesn't work!
// Write the time to all clients every second.
setInterval(function() { 
    var i, sock;
    for (i in clients) {
        sock = clients[i];
        if (sock.writable) { // in case it closed while we are iterating.
            sock.emit("server_time", {
                console.log("server_time sended");
                time: new Date().toString()

            });
        }
    }
}, 1000);       //every second

它是以什么方式不起作用?是否有错误或信息根本没有被发出? - Rob Harrop
如果删除console.log("server_time sended");这行代码,它还能正常工作吗? - halex
在你的 setInterval 函数的最顶部(在 var i、sock 之上)放置一个 console.log。我认为你会发现它被调用得很好,但你的 clients 数组可能为空或套接字不可写。 - PherricOxide
抱歉缺乏细节:没有错误,只是数据没有被发出。似乎setInterval根本没有执行。 - rikner
@halex:移除console.log不会有任何影响。 - rikner
@PherricOxide:谢谢,你说得对。我会看看能否解决这个问题。你有什么想法为什么套接字不可写吗? - rikner
2个回答

2

我可以建议一个解决方法/改进方案来解决这个问题。将客户端添加到一个聊天室中。在某个地方:

io.sockets.on('connection', function (socket) {

添加一个

socket.join('timer');

然后setIntervall将是:
setInterval(function() { 
    io.sockets.in('timer').emit("server_time", { time: new Date().toString() })
}, 1000); 

希望这对您有用!

2
问题在于以下函数:
if (sock.writable) { // in case it closed while we are iterating.
  sock.emit("server_time", {
    // console.log("server_time sended"); // get rid of this line -> invalid code
    time: new Date().toString()
  });
}

sock.writableundefined,因此emit事件从未发送。在连接时将该属性设置为true,在关闭时将其设置为false


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接