[英]Socket.io in Express JS on connection execute multiple times
我引用此倉庫來集成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
});
});
});
這里有什么問題嗎?
我在這里找到答案
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.