【发布时间】:2020-05-10 23:51:47
【问题描述】:
简报发生的事情: * this.lobbyEvents EventEmitter 在大厅结束时发出 'lobby-finished' * 在大厅初始化时,为大厅中的每个玩家运行以下代码:
playerInfoSet.forEach(p => {
if (p.is_bot == true) {
let newPlayer = new Player(p._id, p, true, this.playerCB);
this.playerMap.set(p._id, newPlayer);
this.activePlayers.push(newPlayer);
botCount++;
}
// remove playerInfoSet data for lobby afterwards to stop re-connect to dead lobby.
this.lobbyEvents.on('lobby-finished', () => {
tempcount++;
console.log(`Player deleted ${p._id}?: ${playerInfoSet.delete(p)}, temp count: ${tempcount}`);
})
})
输出: output
此输出一直持续到计数 484。 请注意,当输出更改为 false 以表示已删除时,玩家 ID 的值现在与第一个为 true 的输出相同。 换句话说,EventEmitter 没有像我预期的那样工作。我希望它为每个玩家添加一次监听事件,而不是每个玩家都在监听很多次!
注意:InitLobby 只调用一次。 Initlobby 包含 playerInfoSet && 相关代码。 PlayerInfoSet 每个玩家只有一个。
谢谢!
【问题讨论】:
-
new Player(p._id, p, true, this.playerCB;在语法上无效。请确保发布您的确切真实代码。 -
我不是 100% 确定,但我认为原因是当其中一名玩家离开大厅时,每个玩家都会触发该事件,这意味着所有玩家都会多次收到该事件。
-
约翰,该事件仅在大厅中剩下 0 名玩家时才调用,即所有玩家都已放置并且大厅已准备好删除垃圾收集的引用。
-
我发现了我的问题,当我打算将该事件放在循环之外时,我错误地将它放在了循环中。谢谢你们的时间。
标签: javascript node.js algorithm