2015-08-28 4 views
10

Ho un esempio molto semplice. Questa domanda è stata posta in precedenza più volte nello stesso overflow dello stack, ma non ho potuto ottenere la risposta giusta, quindi vado con questo esempio di base.socket.io emette più volte

Server:

var app = require('express')(); 
var server = require('http').Server(app); 
var io  = require('socket.io')(server); 

server.listen(3000); 

app.get('/', function (req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 

io.on('connection', function (socket) { 
    socket.on('chat', function (data) { 
    var op = false; 
    if(data.id == '1234'){ 
     op = 'yes'; 
    }else{ 
     op = 'no'; 
    } 
    socket.emit('result', { hello: op }); 
    }); 
}); 

Cliente:

<html> 
    <body> 
     <button onclick="check()">Test Me :-)</button> 
     <script src="/socket.io/socket.io.js"></script> 
     <script> 
      var socket = io.connect('http://localhost:3000'); 

      var check = function(){ 

      var data = { id : '234'}; 
      socket.emit('chat', data); 

      socket.on('result', function(data){ 
       console.log('The data is '+data) 
      }) 
      } 
     </script> 
    </body> 
</html> 

Quando clicco il tasto di prova mi ha per la prima volta socket.emit ('risultato', {ciao: 'mondo'}) ; viene emesso una volta. E nella console sto ottenendo questo stampato:

console.log('The data is '+data) 

Ma quando clicco ancora una volta ottengo questo stampato tre volte:

console.log('The data is '+data) 
console.log('The data is '+data) 
console.log('The data is '+data) 

Quando clicco per la terza volta vengo stampato sei volte:

console.log('The data is '+data) 
console.log('The data is '+data) 
console.log('The data is '+data) 
console.log('The data is '+data) 
console.log('The data is '+data) 
console.log('The data is '+data) 

Come questo si sta moltiplicando e andando.

Qualcuno può darmi l'intuizione su come risolvere questo problema. Il tuo aiuto è molto apprezzato. Grazie!

risposta

8

Penso che si aggiungano sempre più ascoltatori a "risultato" per ogni chiamata effettuata.

Prima volta click -> chiamare il numero 1 console.log dalla chiamata 1 ascoltatore

Seconda volta click -> chiamare il numero 1 console.log dalla chiamata 1 ascoltatore + 2 chiamare console.log dalla chiamata 1 ascoltatore + 2 chiamare console .log dall'ascoltatore della chiamata 2

Terza volta -> I registri precedenti + chiama 3 console.log dal listener di chiamata 1 + chiama 3 console.log dal listener di chiamata 2 e chiama 3 console.log dal listener di chiamata 3.

provare a mettere l'ascoltatore per 'risultato' fuori della funzione:

<html> 
<body> 
    <button onclick="check()">Test Me :-)</button> 
    <script src="/socket.io/socket.io.js"></script> 
    <script> 
     var socket = io.connect('http://localhost:3000'); 

     socket.on('result', function(data){ 
      console.log('The data is '+data) 
     }) 
     var check = function(){ 

     var data = { id : '234'}; 
     socket.emit('chat', data); 
     } 
    </script> 
</body> 
</html> 
+1

Grazie molto dude.It fa il trucco :-) – sdg