Socket.io испускает несколько раз

У меня есть очень простой пример. Этот вопрос задавался ранее несколько раз в переполнении стека, но я не мог получить правильный ответ, поэтому я перейду к этому базовому примеру.

Сервер:

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

Клиент:

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

Когда я нажимаю кнопку "Проверить меня" в первый раз socket.emit('result', {hello: 'world'}); он излучается один раз. И в консоли я получаю эту печать:

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)
console.log('The data is '+data)
console.log('The data is '+data)
console.log('The data is '+data)
console.log('The data is '+data) 

Подобным образом он умножается и уходит.

Кто-нибудь, пожалуйста, дайте мне понять, как решить эту проблему. Ваша помощь очень ценится. Спасибо!

Ответ 1

Я думаю, что вы добавляете все больше и больше слушателей к "результату" каждого звонка, который вы делаете для проверки.

Первый клик → вызов 1 console.log из вызова 1 прослушиватель

Второй клик → вызов 1 console.log из вызова 1 прослушиватель + вызов 2 console.log из вызова 1 прослушиватель + вызов 2 console.log из вызова 2 прослушивателя

Третий раз → Предыдущие журналы + вызов 3 console.log из вызова 1 прослушиватель + вызов 3 console.log из вызова 2 слушателя и вызов 3 console.log из прослушивателя 3-го вызова.

Попробуйте вывести слушателя из "результата" из функции:

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