我在服务器上有一个事件,当客户端发送消息时会触发该事件:
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)不起作用,因为函数调用重复。
答案 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++;
});
}