2015-08-28 37 views
10

Çok basit bir örneğim var. Bu soru, yığının kendiliğinden taşmasıyla daha önce birden çok kez sorulmuştur, ancak doğru cevabı bulamadım bu yüzden bu temel örnekle gidiyorum.socket.io birden çok kez yayar

Sunucu:

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

Müşteri:

<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> 

ilk kez socket.emit ('sonucu', {: 'Dünya' merhaba}) testi beni butonuna tıkladığınızda ; bir kez yayılır. Ve konsolda bu baskılı alıyorum:

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

Ama ben bir kez daha tıkladığınızda bu üç kere basılmış olsun:

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

ben altı kez basılan olsun üçüncü kez tıkladığınızda:

Bunun gibi, çarpıyor ve gidiyor.

Bu problemin nasıl çözüleceğine dair bana bir fikir verebilir. Yardımınız büyük beğeni topluyor. Teşekkürler!

cevap

8

Sanırım, kontrol etmek için yaptığınız her aramayı 'sonuçlandırmak' için daha fazla dinleyici ekliyorsunuz.

İlk kez tıklayın -> çağrısı 1 dinleyici 1 console.log çağrı

İkinci kez tıklayın -> Çağrı 1 dinleyicisi 1 console.log çağrı + Çağrı 1 dinleyici 2 console.log çağrı + 2 konsolunu çağrı .log çağrı 2 dinleyicisi

Üçüncü kez -> Önceki günlükler + arama 3 konsol.log çağrıdan 1 dinleyici + arama 3 konsol.log çağrı 2 dinleyici ve çağrı 3 konsol.log çağrı 3 dinleyici. fonksiyon dışı 'sonucu' için dinleyici koyarak

Dene:

<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

Çok teşekkürler dude.It hüner :-) yapar – sdg

İlgili konular