Socket.io 触发多个事件

8

Socket.io似乎呈指数增长地发送多个消息,这里有一个我正在运行的示例会导致此问题。

客户端代码:

<html>
<head>
<script type="text/javascript" src="../../js/jquery191.min.js"></script>
<script type="text/javascript" src="http://192.168.1.2:8887/socket.io/socket.io.js"></script>
</head>

<body>

<button>Click Me!</button>

<script type="text/javascript">
$(document).ready(function(){
var socket = io.connect('http://192.168.1.2:8887');

$("button").click(function(){

    console.log("Emitting test_parent");
    socket.emit('test_parent');

    socket.on('test_parent_server', function(data){
        console.log("Handling test_parent_server");


        console.log("Emitting test_child");
        socket.emit('test_child');

        socket.on('test_child_server', function(ing){
            console.log("Handling test_child_server");

        });

    });
});
});
</script>
</body>
</html>

服务器端:

socket.on("test_parent", function(){
    socket.emit("test_parent_server", { data : " " });
});

socket.on("test_child", function(){
    socket.emit("test_child_server", { data : " " });
});

每次点击按钮时,由于某种原因,事件会被多次触发,数量呈指数级增长。我试图找到问题所在,但无法进行调试或在网上查找相关信息。
1个回答

24
每次调用单击处理程序时,都会向套接字附加其他事件侦听器。 你之前添加的侦听器仍然处于活动状态。 你需要开始使用removeListenerremoveAllListeners来删除旧侦听器,或者将侦听器代码移到单击处理程序之外,以便它不会被多次调用。
例如:
$("button").click(function() {
    console.log("Emitting test_parent");
    socket.emit('test_parent');
});

socket.on('test_parent_server', function(data) {
    console.log("Handling test_parent_server");

    console.log("Emitting test_child");
    socket.emit('test_child');
});

socket.on('test_child_server', function(ing) {
    console.log("Handling test_child_server");
});

谢谢!我没有意识到socket.io会像那样连接回调函数,现在我按照你的方式构建它,它可以工作了! - Joseph Shering
1
@JosephShering,这并不是针对socket.io特定的。大多数事件系统都是这样工作的。我很高兴它起作用了。如果您满意我的答案,请将其标记为已接受。 - Bret Copeland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接