Node.js和socket.io初始化setInterval()

时间:2014-04-02 11:30:33

标签: node.js express socket.io

我在服务器上有一个事件,当客户端发送消息时会触发该事件:

socket.on('message', function(data){
        message.push(data);
});

现在当所有客户端发送消息时,我想等待3秒然后调用函数。

我试过Interval:

var index=0;
var timer;


socket.on('message', function(data){
    message.push(data);
    if (index==0) //only once
       timer = setInterval(call(), 3000);
    index++;
});

function call(){
     io.sockets.emit("confirmation", {status: "All messages are delivered"});
     clearInterval(timer); // Clear interval
}

问题是函数call()立即调用而不是3秒后调用。 第二个问题是函数调用中的clearInterval(timer)不起作用,因为函数调用重复。

3 个答案:

答案 0 :(得分:2)

如果您只希望这种情况发生一次,则应使用setTimeout代替setInterval。 这样可以避免以后需要清除时间间隔,并使代码更加明确,您希望它在#34;现在正好发生一次,3秒。"

另外"(...)"在函数名称的末尾会导致立即调用它。你想传递函数" call"作为参数,不要立即调用它。

我还建议你将函数命名为call以外的函数,因为这已经是Javascript中标准函数的名称,因此可能会很快混淆。即使调用它callback也会减少混淆。

所以,你正在寻找的东西是这样的:

setTimeout(callback,3000);

代替这个

setInterval(call(), 3000);

答案 1 :(得分:0)

您正在从setInterval函数调用该函数。

它应该是timer = setInterval(call, 3000);而不是 timer = setInterval(call(),3000);

答案 2 :(得分:0)

感谢所有答案。我解决了这个问题。 问题是我想在setInterval()内创建一个io.on("connection", function(socket){},但它会分别为每个客户端创建。我不想要这个。 现在我把它放在前面,它起作用了:

var index=0;
var timer;
var check=false;

timer = setInterval(function(){fcall()}, 3000);

function fcall(){
   if(check)
   {
       io.sockets.emit("confirmation", {status: "All messages are delivered"});
       clearInterval(timer); // Clear interval
       timer=0;
   }
}

io.on("connection", function(socket){

   socket.on('message', function(data){
     message.push(data);
     if (index==0) //only once
       check = true;
     index++;
   });

}