Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Express JS on connection中的Socket.io执行多次_Javascript_Node.js_Express_Socket.io - Fatal编程技术网

Javascript Express JS on connection中的Socket.io执行多次

Javascript Express JS on connection中的Socket.io执行多次,javascript,node.js,express,socket.io,Javascript,Node.js,Express,Socket.io,我指的是integratedsocket.io 我想要实现的是,在服务器端运行一个倒计时计时器,它每秒向客户端发送一次setInterval。我得到的结果是 那里的终端在。('connection')上,我第一次刷新页面时,它在。('connection')上执行了4次,倒计时正常。然后我第二次刷新,它在('connection')上执行了8次,倒计时计时器也有2个值。然后继续。。。。12次,16次 在app.js中 app.use(function(req, res, next){ re

我指的是integratedsocket.io

我想要实现的是,在服务器端运行一个倒计时计时器,它每秒向客户端发送一次
setInterval
。我得到的结果是

那里的终端在。('connection')上,我第一次刷新页面时,它在。('connection')上执行了4次
,倒计时正常。然后我第二次刷新,它在('connection')
上执行了8次
,倒计时计时器也有2个值。然后继续。。。。12次,16次

在app.js中

app.use(function(req, res, next){
  res.io = io; 
  io.on('connection', function(socket) {
    console.log(socket.id + ' connected.');
  }); 
  next();
});
router.get('/', function(req, res, next) {

  models.User.findAll({
    include: [ {model: models.Task, as: 'tasks'} ]
  }).then(function(users) {

    var eventTime= new Date('2017-03-31 13:00:00').getTime();
    var currentTime = new Date().getTime();
    var diffTime = eventTime - currentTime;
    var duration = moment.duration(diffTime*1000, 'milliseconds');
    var interval = 1000;

    setInterval(function() {
      duration = moment.duration(duration - interval, 'milliseconds');
      res.io.emit('countdown', { time_left: duration.hours() + ":" + duration.minutes() + ":" + duration.seconds() }); 
    }, interval);

    res.render('users', {
      title: 'Sequelize: Express Example',
      users: users
    });   
  });   
});
routes/users.js中

app.use(function(req, res, next){
  res.io = io; 
  io.on('connection', function(socket) {
    console.log(socket.id + ' connected.');
  }); 
  next();
});
router.get('/', function(req, res, next) {

  models.User.findAll({
    include: [ {model: models.Task, as: 'tasks'} ]
  }).then(function(users) {

    var eventTime= new Date('2017-03-31 13:00:00').getTime();
    var currentTime = new Date().getTime();
    var diffTime = eventTime - currentTime;
    var duration = moment.duration(diffTime*1000, 'milliseconds');
    var interval = 1000;

    setInterval(function() {
      duration = moment.duration(duration - interval, 'milliseconds');
      res.io.emit('countdown', { time_left: duration.hours() + ":" + duration.minutes() + ":" + duration.seconds() }); 
    }, interval);

    res.render('users', {
      title: 'Sequelize: Express Example',
      users: users
    });   
  });   
});

这里有什么问题吗?

我想您可能将
io.on('connection')
事件保持在设置间隔内。这就是为什么它每次都在*2中进行复制

如果要实现倒计时,可以这样做:

io.on('connection', function (socket){
  var tick = 0;
  setInterval(function(){

    socket.emit('timer', tick++)
  }, 1000);
}) 
现在,您可以在前端收听
计时器
事件并显示结果。

谢谢

我想您可能将
io.on('connection')
事件保持在设置间隔内。这就是为什么它每次都在*2中进行复制

如果要实现倒计时,可以这样做:

io.on('connection', function (socket){
  var tick = 0;
  setInterval(function(){

    socket.emit('timer', tick++)
  }, 1000);
}) 
现在,您可以在前端收听
计时器
事件并显示结果。
谢谢我找到了答案

io.on('connection',函数(socket){
socket.removeAllListeners();我找到了答案

io.on('connection',函数(socket){

socket.removeAllListeners();请解释您的问题?我想创建一个倒计时计时器,通常倒计时是由js在前端完成的。但我想在后端完成,因此我使用socket.io。当我在服务器端调试连接时(我放置
console.log
)显示调试消息。它显示4次相同的消息,当我刷新浏览器时,显示8次,然后是12次,16次,等等。请解释您的问题?我想创建一个倒计时计时器,通常倒计时由js在前端完成。但我想在后端完成,因此我使用socket.io。当我在服务器端调试连接时(我放置
console.log
)以显示调试消息。它显示4次相同的消息,当我刷新浏览器时,显示8次,然后是12次、16次,等等。如果我的问题不清楚,请担心。现在我为我的问题添加更多代码。如果我的问题不清楚,请感谢。现在我为我的问题添加更多代码。谢谢