如何在node.js / socket.io中使用removeListener来防止多个触发的函数

时间:2017-02-28 02:59:49

标签: node.js websocket socket.io p5.js

我遇到socket.io/node.js的问题。我正在向服务器发送客户端,反之亦然,即使我只触发一次,它也会触发我的多个功能。所以这是我的代码

客户方;

for (var x = circles.length - 1; x >= 0; x--) {
    if (circle.eat(circles[x])) {
        position = {
             x: circles[x].position.x,
             y: circles[x].position.y,
             r: circles[x].position.r,
             index: x
        };
        circles.splice(x, 1);
        socket.emit('eat', position); //Here's the emit to server.
   }
}

服务器端;

var events = require('events');
var eventEmitter = new events.EventEmitter();

socket.on('eat',
    function(data){
    circlePosition.splice(data.index, 1);
    counter++;
    eventEmitter.removeListener('eat', this); //Removing this listener but planning to use it again by adding it again using addListener
});

我已经尝试通过if else将传入数据与最近发送的数据进行比较以避免重复数据,即使它会被多次触发但仍然会出现问题,如果我使用该方法,数据的精度将是一个问题。所以我试图使用removeListener和addListener,但错误是;

enter image description here

如何摆脱这个?

修改

我试图让 listen 变量在从客户端发送到服务器后再次变为true,这是代码

客户端:

for (var x = circles.length - 1; x >= 0; x--) {
    if (circle.eat(circles[x])) {
        position = {
            x: circles[x].position.x,
            y: circles[x].position.y,
            r: circles[x].position.r,
            index: x,
                        listen: false   //Condition to if else in server side
        };
        circles.splice(x, 1);
        socket.emit('eat', position); //Here's the emit to server.
    }
}

服务器端:

socket.on('eat', eatFunction);

function eatFunction(data){
    if(!data.listen){   //listen variable used inside the if else block
        circlePosition.splice(data.index, 1);
        counter++;
        data.listen = null;
        console.log(data.listen + " " + counter); //to see if the listen becomes null and the counter to see how many times it triggers
        eventEmitter.removeAllListeners('eat', eatFunction);
    }
}

我认为问题是客户端问题,因为它发送的内容超过了应用程序,而不是接收方。

1 个答案:

答案 0 :(得分:1)

看看这一行:

eventEmitter.removeListener('eat', this);

您认为this指的是什么对象?看起来你认为它指的是功能,但事实并非如此。 JavaScript中的this关键字可能有点棘手,但基本上它将引用包含函数的实例,而不是函数本身。

您需要传递对函数本身的引用。如果您停止使用内联函数并使用命名函数,则可能更容易:

socket.on('eat', eatFunction);

function eatFunction(data){
    circlePosition.splice(data.index, 1);
    counter++;
    eventEmitter.removeListener('eat', eatFunction);
}

请注意,eatFunction()现在有一个名称,因此您可以将其用作on()removeListener()函数的参数。

无耻的自我推销:我已经编写了一个关于创建可用JavaScript函数的教程here

编辑:如果您要做的只是对事件做出最大反应,那么为什么不使用一个跟踪您是否应对事件作出反应的变量?像这样:

var listen = true;

socket.on('eat', eatFunction);

function eatFunction(data){
    if(listen){
       circlePosition.splice(data.index, 1);
       counter++;
       listen = false;
    }
}