【问题标题】:Why is this event handler being called over 400 times when it's only listened to 20 times?为什么这个事件处理程序只听了 20 次却被调用了 400 多次?
【发布时间】: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 的输出相同。 换句话说,Eve​​ntEmitter 没有像我预期的那样工作。我希望它为每个玩家添加一次监听事件,而不是每个玩家都在监听很多次!

注意:InitLobby 只调用一次。 Initlobby 包含 playerInfoSet && 相关代码。 PlayerInfoSet 每个玩家只有一个。

谢谢!

【问题讨论】:

  • new Player(p._id, p, true, this.playerCB; 在语法上无效。请确保发布您的确切真实代码。
  • 我不是 100% 确定,但我认为原因是当其中一名玩家离开大厅时,每个玩家都会触发该事件,这意味着所有玩家都会多次收到该事件。
  • 约翰,该事件仅在大厅中剩下 0 名玩家时才调用,即所有玩家都已放置并且大厅已准备好删除垃圾收集的引用。
  • 我发现了我的问题,当我打算将该事件放在循环之外时,我错误地将它放在了循环中。谢谢你们的时间。

标签: javascript node.js algorithm


【解决方案1】:

已修复。 确保将事件调用代码放在循环之外......呵呵。寻找愚蠢的错误!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 2011-08-29
    • 2011-05-15
    相关资源
    最近更新 更多