node.js - socket.io 发出多次

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

客户:

<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('结果', { 你好:'世界' }); 它被发射一次。在控制台中,我正在打印:

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 控制台日志

第二次点击 -> 从调用 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>

关于node.js - socket.io 发出多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32265731/

相关文章:

javascript - 在express js中,太多的中间件函数会降低性能吗?

javascript - Node.js:路由优先级和排序 (sails.js)

node.js - 同步调用redis方法

node.js - 如何在另一个类中使用类函数?

node.js - 尝试获取 Azure Blob 存储中非公开的文件时,Azure 函数收到 AuthorizationFailure

javascript - Mongoose findOne 基于另一个文档导致未处理的 Promise Rejection 错误

javascript - 使用 UTF-8 时 JSON 通过流识别为无效

javascript - socket.io 如何发送到以某些关键字开头的房间

javascript - Node.js socket.io 为单个事件返回多个值

javascript - Ubuntu 上 Apache 服务器上的 Proxypass 套接字 io