server.js
io.on('connection', function (socket) {
var addedUser = false;
socket.on('setTimer', function(data) {
timer.setEndTime(data.time);
socket.broadcast.emit('currentEndTime', {time: timer.getEndTime() });
});
});
client.js
$(function() {
var timer = new Timer(),
socket = io.connect('http://localhost:3000');
socket.on('currentEndTime', function (data) {
//this is the full date time in ms.
timer.setEndTimeFromServer(data.time);
});
set = setInterval(function(){
$('.time').trigger('click');
clearInterval(set);
},100);
$('.time').on('click', function(e) {
e.stopPropagation();
var time = $(this).text() * 1000;
timer.setEndTime(time);
timer.timeRemaining();
socket.emit('setTimer', { time: time });
});
});
您好,我正在尝试为节点js / socket io应用程序集成倒数计时器。定时器工作正常,但如何在新的套接字连接/页面刷新时避免定时器重置。谢谢
答案 0 :(得分:1)
这是因为两件事:
您可以将每个单独的计时器存储在键值存储中。您可以使用IP地址作为键和计时器值作为值或类似的值。这样,当用户连接到服务器并继续倒计时时,您可以为用户检索计时器的当前值。
如果您使用套接字ID作为密钥,除了毫无意义地填充密钥值存储空间并增加内存使用量之外,它将无济于事。使用更持久的东西,例如IP地址,用户名,电子邮件或类似的东西作为计时器的键和当前值作为值。
此外,您当前的解决方案存在缺陷,因为它面临“刷新延迟”。当您点击刷新按钮时,您将停止计算重新呈现网页所花费的时间。如果它只是几毫秒,你就没事了;但只要它达到几百毫秒,这将产生实际的差异。在服务器端进行倒计时。只需按设定的时间间隔通知客户。这会增加服务器的工作量,但至少你不一定会有不好的计时器。
如果您要进行一次倒计时,例如“x天,x小时,x分钟,超级碗剩余x秒或其他一些重大事件”,那么没有socket.io你会好得多。只需将时间戳发送给客户端的大事件,然后在客户端执行其余操作。