2016-07-15 7 views
0

Ich habe socket.io in eine kleine React-Anwendung aufgenommen und alle Listener in "componentWillMount" eingerichtet, wie unten gezeigt.Socket.io mehrmals aktualisieren

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));  
} 

Auf der Serverseite, ich habe dies:

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); 
    }); 
}); 

Wenn ich nur eine Instanz der App geöffnet haben es funktioniert gut, aber mit zwei scheint es zweimal jede Sekunde zu aktualisieren, dann mit drei, drei mal etc. Die console.logs zeigen dies auch. Ich denke, es liegt an neuen Verbindungen mit dem Server, aber ich bin mir nicht sicher, wie ich das beheben soll.

Immer noch ziemlich neu zu socket.io, so dass jede Hilfe willkommen ist. Ich danke dir sehr!

Bearbeiten: Ich reparierte es durch nur Löschen auf Verbindung, aber wie würde ich Dinge auf einem Socket trennen?

+0

sollte nicht die serverseite 'socket.emit()' verwenden? Sie erstellen bei jedem Client-Verbindungsaufbau einen Timer, sodass Sie Daten für jeden Client mit einem weiteren Timer ausgeben.4 – thst

+0

Wenn ich möchte, dass jede Verbindung die gleichen Daten enthält, wäre das nicht io.emit? Ich dachte, socket.emit hätte neue Daten für jeden Socket generiert, aber ich könnte falsch sein –

+0

dann müssen Sie den Timer außerhalb der Connect-Funktion erstellen oder sicherstellen, dass es nicht zweimal erstellt wird. – thst

Antwort

1

Sie erstellen einen Timer für jede eingehende Verbindung. Dies ist nur einmal erforderlich.

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--; 
    }); 
});