2012-10-08 100 views
3

使用node.js,我試圖在每秒鐘將所有客戶端發送當前的server_time。 因此,我想用setInterval()向所有客戶發送一個事件併發送時間,但它不起作用。我是否在正確的地方定義了setInterval函數,或者錯過了其他的東西?node.js 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 
+0

它不起作用的方式?有沒有錯誤或消息是不是發出? –

+0

如果你刪除'console.log(「server_time sended」);'? – halex

+0

把一個console.log放在你的setInterval函數的最上面(上面的var i,sock;)。我想你會發現它被調用的很好,但是你的客戶端數組是空的或者套接字是不可寫的。 – PherricOxide

回答

2

我可以提出一個應該解決問題的解決方法/改進方案。將客戶添加到chat room。某處:

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