【问题标题】:Getting: RangeError: Maximum call stack size exceeded获取:RangeError:超出最大调用堆栈大小
【发布时间】:2014-09-03 18:18:39
【问题描述】:

我正在使用节点 js 和套接字 IO 创建游戏。

我正在创建如下播放器

  var player =  new playa.playa();
        player.name = info.name;
        player.picture = info.picture;
        player.email = info.email;
        player.user_id = info.user_id;
        player.socket = socket;

然后我将播放器添加到我的数组中

      playerPool[info.user_id] = player;

已映射,因此我可以引用 playerPool[user_Id] 而无需遍历循环

然后我想将我的播放器添加到我的游戏中

        g.addPlayer(playerPool[info.user_id]);


        this.addPlayer = function(player)
        {
            var self = this;
            if(this.max_players > this.current_players.length)
            {
                 self.current_players[player_userid] =player;
            }
         }

但是,我不断收到错误

for(var key in obj)  RangeError max call stack size exceeded

我的问题是

  1. 为什么 JavaScript 循环遍历我的键?

如果我打电话

       player.user_id

它返回播放器类的用户ID,所以我知道它是一个有效的对象。

我从未要求 JavaScript 遍历对象,只需将其重新映射到游戏类中的玩家数组,就像我对玩家池所做的那样。然而,这似乎是一个问题。有没有人遇到过同样的问题?

【问题讨论】:

  • playPool 数组是如何声明的?
  • 首先我看到 current_player 是一个没有长度的对象,除非你分配 current_player=[] 但是如果你以这种方式初始化 current_player[user_id] 其中用户 id = 50 将自动创建 50 个值这将使长度为 50
  • @Huangism var playerPool = [];那不是问题。我能够传递玩家对象,甚至可以在游戏类中提取其属性。问题是“玩家”对象不能分配给 self.current_players 这是一个类范围 var this.current_players = []
  • @Sunand 我明白了.. 我认为这是正在发生的事情。然后我怎样才能成功地将键映射到 current_players obj。
  • 将当前播放器初始化为对象 i,例如 this.current_players ={} 还维护另一个属性,比如 this.playerCount=0 并在添加播放器函数中增加它:)

标签: javascript node.js loops


【解决方案1】:

for 循环的语法正是这样做的,它循环遍历该对象的键值

所以语法

for(var key in obj) 

将给出该对象的键,即属性。为了访问对象值,您需要在此 for 循环中使用 obj[key]。

获取您创建的数组值的另一种方法是:

playerPool.forEach(function(player) {
   //Over here you get each player in the array
});

【讨论】:

  • 有趣。好的,但我的问题是为什么我不能将我的对象设置为另一个数组?
  • self.current_players[player_userid] =player;这总是返回一个空数组
猜你喜欢
  • 1970-01-01
  • 2018-01-24
  • 2018-02-06
  • 2012-08-14
  • 1970-01-01
  • 2012-08-15
  • 2021-05-30
相关资源
最近更新 更多