【发布时间】:2015-11-22 12:54:40
【问题描述】:
我正在使用 Socket.io 在 NodeJS 中编写游戏。我有一个Player 类,用户可以在其中登录和退出游戏。但是,当客户端退出游戏并重新加入时,他们的旧事件侦听器会触发两次。
我尝试查看this 问题,但它似乎不起作用,因为它仍然会产生重复的输出。
我的代码:
输出:
[+] Player [OZYaW0Ncrfg21NJDAAAB] has logged in.
[+] Player moved to [10,111]
[-] Player [OZYaW0Ncrfg21NJDAAAB] has logged out.
[+] Player moved to [10,111]
[+] Player [OZYaW0Ncrfg21NJDAAAB] has logged in.
[+] Player moved to [10,111]
[+] Player moved to [10,111] <-- this should not happen!
[-] Player [OZYaW0Ncrfg21NJDAAAB] has logged out.
client.js
var socket = io('http://localhost:8080/');
socket.emit('player.login');
socket.emit('player.move', [10, 111]);
socket.emit('player.logout');
socket.emit('player.move', [10, 111]);
socket.emit('player.login');
socket.emit('player.move', [10, 111]);
socket.emit('player.logout');
main.js
var io = require('socket.io')(8080);
var Player = require('./Player');
// All players
var players = {};
io.on('connection', function(socket) {
// On login
socket.on('player.login', function() {
players[socket.id] = new Player(socket);
console.log('[+] Player [' + socket.id + '] has logged in.');
});
// On logout
socket.on('player.logout', function() {
delete players[socket.id];
console.log('[-] Player [' + socket.id + '] has logged out.');
});
});
Player.js
/**
* Player class
* @param socket
* @constructor
*/
function Player(socket) {
this.socket = socket;
this.position = {x : 0, y : 0};
this.__bind();
}
/**
* Move a player
* @param {Array} position
*/
Player.prototype.move = function(position) {
this.position.x = position[0];
this.position.y = position[1];
console.log("[+] Player moved to [" + position[0] + ',' + position[1] + ']');
};
/**
* Add event listeners
* @private
*/
Player.prototype.__bind = function() {
this.socket.on('player.move', this.move.bind(this));
this.socket.on('player.logout', this.__unbind.bind(this));
};
/**
* Remove event listeners
* @private
*/
Player.prototype.__unbind = function() {
this.socket.removeListener('player.move', this.move);
};
// Exports
module.exports = Player;
【问题讨论】:
标签: javascript node.js sockets