Функция выполняется несколько раз, почему ( Node JS + Socket IO )?

Друзья, привет. Столкнулся с такой проблемой, что сокеты отправляют функция несколько раз в одно и то же время.

Нужно сделать так, чтобы она отправлялась 1 раз в 3 секунды. Может проблема в setTimeout? ( Функция usersCount() )

Пример кода:
io.sockets.on('connection', function(socket){
    console.log('connect');
   setTimeout(usersCount, 3000);
   
});

/* Доступ к статистике */ 

function usersCount() {
		connection.query('SELECT COUNT(*) FROM `users`', function(err, rows) {
		users = rows['0']['COUNT(*)'];
		});  
		
		https_server.getConnections(function (err, count) {
		online = count;
		});
		
		connection.query('SELECT COUNT(*) FROM `drops`', function(err, rows) {
		drops_count = rows['0']['COUNT(*)'];
		});


			var json = {
			
			users: users,
			online: online,
			drops: drops_count
			
			};

        socket.emit('stats',json); // отправим в сокеты

   setTimeout(usersCount, 5*3000);
}

5c52b7a5ab40c578145325.png
  • Вопрос задан
  • 285 просмотров
Решения вопроса 1
@VitteDev Автор вопроса
Разобрался, убрал
io.sockets.on('connection', function(socket){
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Deissh
@Deissh
I like Python, Node.JS, Go, pain, bugs and my cat.
С помощью SetTimeout вы не ограничивает кол-во выполнения в секунду, а просто откладываете вызов на 3 секунды. И если было 2 коннекта подряд, то через 3 секунды usersCount вызовится 2 раза.
Ответ написан
megafax
@megafax
web-программист
Вам необходимо выполнять функцию отправки только при условии наличия подключенных пользователей и отправлять по всем подключениям (далее их можно разделить по комнатам/группам и по каждой комнате отправлять нужные данные).

setIterval(usersCount, 5 * 3000);

function usersCount() {
  io.sockets.clients((err, clients) => {
    if (err) throw err;
    if (clients.length) {
     // do some sql
     io.sockets.emit('stats', json);
    }
  });
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы