如何在页面刷新,节点js / socket io上避免倒数计时器重置

时间:2017-06-05 09:11:36

标签: node.js socket.io

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应用程序集成倒数计时器。定时器工作正常,但如何在新的套接字连接/页面刷新时避免定时器重置。谢谢

1 个答案:

答案 0 :(得分:1)

这是因为两件事:

  1. 当您点击刷新按钮并创建一个新按钮时,您的套接字就会消失,因此当您点击刷新按钮时,您与服务器的连接(以及计时器值)就会消失。
  2. 首先加载页面时,您无法获取计时器的当前值并将其打印在页面上以启动所有内容。
  3. 您可以将每个单独的计时器存储在键值存储中。您可以使用IP地址作为键和计时器值作为值或类似的值。这样,当用户连接到服务器并继续倒计时时,您可以为用户检索计时器的当前值。

    如果您使用套接字ID作为密钥,除了毫无意义地填充密钥值存储空间并增加内存使用量之外,它将无济于事。使用更持久的东西,例如IP地址,用户名,电子邮件或类似的东西作为计时器的键和当前值作为值。

    此外,您当前的解决方案存在缺陷,因为它面临“刷新延迟”。当您点击刷新按钮时,您将停止计算重新呈现网页所花费的时间。如果它只是几毫秒,你就没事了;但只要它达到几百毫秒,这将产生实际的差异。在服务器端进行倒计时。只需按设定的时间间隔通知客户。这会增加服务器的工作量,但至少你不一定会有不好的计时器。

    如果您要进行一次倒计时,例如“x天,x小时,x分钟,超级碗剩余x秒或其他一些重大事件”,那么没有socket.io你会好得多。只需将时间戳发送给客户端的大事件,然后在客户端执行其余操作。