簡體   English   中英

Express JS中的Socket.io在連接上執行多次

[英]Socket.io in Express JS on connection execute multiple times

我引用此倉庫來集成socket.io。

我要實現的是一個倒數計時器,該計時器每秒鍾發送到客戶端一次, setInterval在服務器端運行。 我得到的結果是

Socket.io和Express JS

終端on.('connection') ,我第一次刷新頁面時,它執行了4次on.('connection') ,倒計時工作正常。 然后我第二次刷新,它執行了8次on.('connection') ,並且倒數計時器在那里也有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();
});

routes / users.js中

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', function(socket) {
  socket.removeAllListeners(); <---------- ADD THIS LINE
  console.log(socket.id + ' connected.');
}); 

我認為您可能在setInterval中保持了io.on('connection')事件。 這就是為什么它每次都在* 2中保持復制。

如果要實現倒數計時器,可以這樣操作:

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

    socket.emit('timer', tick++)
  }, 1000);
}) 

現在,您可以在前端監聽timer事件並顯示結果。 謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM