2016-07-15 2 views
0

Я включил 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, поэтому любая помощь приветствуется. Спасибо огромное!

Редактировать: Я исправил его, просто удалив соединение, но как бы я мог что-то делать при отключении сокета?

+0

Не следует использовать серверную команду 'socket.emit()'? Вы создаете таймер каждый раз, когда клиент подключается, поэтому вы отправляете данные для каждого клиента с еще одним таймером. – thst

+0

Если бы я хотел, чтобы каждое соединение имело одни и те же данные, не было бы io.emit? Я думал, что socket.emit создаст новые данные для каждого сокета, но я могу ошибаться –

+0

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

ответ

1

Вы создаете таймер для каждого входящего соединения. Это необходимо сделать только один раз.

var connected = 0; 

const pulse = setInterval(function() { 
    console.log("From server."); 
    if(connected > 0) { 
     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); 

io.on('connection', function(socket) { 
    connected++; 
    socket.on('disconnect', function() { 
     connected--; 
    }); 
}); 
Смежные вопросы