Я включил socket.io в небольшое приложение React и настроил всех слушателей в «componentWillMount», как показано ниже.Socket.io обновление несколько раз
componentWillMount() {
const socket = io();
socket.on('update', function(newDataPoint) {
console.log("Client updating!");
this.setState({
count: newDataPoint.count,
temperature: newDataPoint.temperature,
humidity: newDataPoint.humidity,
pressure: newDataPoint.pressure
});
}.bind(this));
}
На стороне сервера, у меня есть это:
io.on('connection', function(socket) {
const pulse = setInterval(function() {
console.log("From server.");
io.emit('update', {
temperature: Math.floor(Math.random() * 10 + 70),
count: Math.floor(Math.random() * 300) + 5000,
humidity: Math.floor(Math.random() * 5) + 30,
pressure: Math.floor(Math.random() * 3) + 29
});
}, 1000);
socket.on('disconnect', function() {
clearInterval(pulse);
});
});
Когда я только один экземпляр приложения открыть он отлично работает, но с двумя, кажется, обновлять два раза в секунду, то три, три раза и т. д. Это тоже показывает console.logs. Я думаю, что из-за новых соединений, сформированных с сервером, но я не уверен, как это исправить.
Все еще довольно новый для socket.io, поэтому любая помощь приветствуется. Спасибо огромное!
Редактировать: Я исправил его, просто удалив соединение, но как бы я мог что-то делать при отключении сокета?
Не следует использовать серверную команду 'socket.emit()'? Вы создаете таймер каждый раз, когда клиент подключается, поэтому вы отправляете данные для каждого клиента с еще одним таймером. – thst
Если бы я хотел, чтобы каждое соединение имело одни и те же данные, не было бы io.emit? Я думал, что socket.emit создаст новые данные для каждого сокета, но я могу ошибаться –
, тогда вы должны создать таймер вне функции подключения или убедиться, что он не создан дважды. – thst