socket.io多次发出

sdg*_*sdg 12 node.js express 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 });
  });
});
Run Code Online (Sandbox Code Playgroud)

客户:

<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>
Run Code Online (Sandbox Code Playgroud)

当我第一次单击test me按钮时,socket.emit('result',{hello:'world'}); 它被发射一次.在控制台中我得到了这个印刷品:

console.log('The data is '+data)
Run Code Online (Sandbox Code Playgroud)

但是当我再次点击时,我打印了三次:

console.log('The data is '+data)
console.log('The data is '+data)
console.log('The data is '+data)
Run Code Online (Sandbox Code Playgroud)

当我第三次点击时,我会打印六次:

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) 
Run Code Online (Sandbox Code Playgroud)

像这样,它正在成倍增长.

任何人都可以给我一些如何解决这个问题的见解.非常感谢您的帮助.谢谢!

ces*_*uis 15

我想你正在为每次打电话的"结果"添加越来越多的听众.

首次单击 - >从调用1侦听器调用1 console.log

第二次单击 - >从调用1监听器调用1 console.log +从调用1监听器调用2 console.log从调用2监听器调用2 console.log

第三次 - >以前的日志+从调用1监听器调用3 console.log +从调用2监听器调用3 console.log并从调用3监听器调用3 console.log.

尝试将"结果"的监听器放在函数之外:

<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>
Run Code Online (Sandbox Code Playgroud)


小智 15

对于客户端,您可以使用socket.once()代替socket.on(). 例子:

socket.once('result', function(data){
 console.log('The data is '+data)
})
Run Code Online (Sandbox Code Playgroud)

参考:https : //socket.io/docs/v3/listening-to-events/#socket-once-eventName-listener