我遇到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,但错误是;
如何摆脱这个?
修改
我试图让 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);
}
}
我认为问题是客户端问题,因为它发送的内容超过了应用程序,而不是接收方。
答案 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;
}
}