我引用this repo来集成socket.io。
我想要实现的是倒数计时器,每秒发送给客户端,setInterval
在服务器端运行。我得到的结果是
终端有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
});
});
});
这里出了什么问题?
答案 0 :(得分:4)
我找到了答案here
io.on('connection', function(socket) {
socket.removeAllListeners(); <---------- ADD THIS LINE
console.log(socket.id + ' connected.');
});
答案 1 :(得分:-1)
我认为您可能在setInterval中保留io.on('connection')
事件。这就是为什么它每次都在* 2中继续复制。
如果你想要实现倒数计时器,你可以这样做:
io.on('connection', function (socket){
var tick = 0;
setInterval(function(){
socket.emit('timer', tick++)
}, 1000);
})
现在您可以在前端收听timer
事件并显示结果。
感谢