javascript - Socket.io - 发出 JS 对象导致最大递归错误,然后根本不发送

标签 javascript websocket socket.io

我有一个存储另外两个对象的对象。自上次加载页面以来第一次将此特定对象发送到服务器时,我收到此错误:

Uncaught RangeError: Maximum call stack size exceeded
at Function.[Symbol.hasInstance] (<anonymous>)
at r (socket.io.js:1)
at r (socket.io.js:1)
at r (socket.io.js:1)
at r (socket.io.js:1)
at r (socket.io.js:1)
at r (socket.io.js:1)
at r (socket.io.js:1)
at r (socket.io.js:1)
at r (socket.io.js:1)

我在谷歌上搜索了可能的答案,并且尝试发送其他不太大的对象,效果很好。

此外,一旦抛出错误,再次发送对象,发送对象,但未收到。我不知道如何解决这个问题。

我尝试发送的对象是:

data {
    p1: {
        name: "Player 1",
        obj: {
            angle:0,
            dir:0,
            health:100,
            name:"Player 1",
            pos:p5.Vector {p5: p5, x: 0, y: 0, z: 0},
            projectiles:[],
            show: {
                noStroke();
                fill(255);

                for (let i in this.projectiles) { this.projectiles[i].show() }

                push();
                translate(this.pos.x, this.pos.y);
                rotate(PI - this.angle);
                imageMode(CENTER);
                image(pgraphic, 0, 0, this.health / 2, this.health / 2);
                pop();
            }
            update: function () {
                if (this.useControls) {
                if (keyIsDown(68))
                this.angle -= 0.125;
                else if (keyIsDown(65))
                this.angle += 0.125;

                if (keyIsDown(87)) {
                this.dir = 1;
                } else if (keyIsDown(83)) {
                this.dir = -1;
                } else if (!keyIsDown(87) && !keyIsDown(83))
                this.dir = 0;

                if (keyIsDown(32))
                this.shoot()

                this.pos.x += ((this.health / 10) * sin(this.angle)) * this.dir;
                this.pos.y += ((this.health / 10) * cos(this.angle)) * this.dir;

                this.pos.x = constrain(this.pos.x, 0 - width / 2, width / 2);
                this.pos.y = constrain(this.pos.y, 0 - height / 2, height / 2);

                for (let i in this.projectiles) {
                this.projectiles[i].update()

                if (this.projectiles[i].pos.x <= 0 - (width / 2) || 
                this.projectiles[i].pos.x >= (width / 2) || 
                this.projectiles[i].pos.y <= 0 - ((height / 2) * 1.5) || 
                this.projectiles[i].pos.y >= (height / 2)) {
                this.projectiles.splice(i, 1)
                }}}
            }
            useControls:true,
            vel:p5.Vector {p5: p5, x: 0, y: 0, z: 0},
        }
    },
    p2: {
        name: "Player 2",
        obj: {
            angle:0,
            dir:0,
            health:100,
            name:"Player 2",
            pos:p5.Vector {p5: p5, x: 0, y: 0, z: 0},
            projectiles:[],
            show: {
                noStroke();
                fill(255);

                for (let i in this.projectiles) { this.projectiles[i].show() }

                push();
                translate(this.pos.x, this.pos.y);
                rotate(PI - this.angle);
                imageMode(CENTER);
                image(pgraphic, 0, 0, this.health / 2, this.health / 2);
                pop();
            }
            update: function () {
                if (this.useControls) {
                if (keyIsDown(68))
                this.angle -= 0.125;
                else if (keyIsDown(65))
                this.angle += 0.125;

                if (keyIsDown(87)) {
                this.dir = 1;
                } else if (keyIsDown(83)) {
                this.dir = -1;
                } else if (!keyIsDown(87) && !keyIsDown(83))
                this.dir = 0;

                if (keyIsDown(32))
                this.shoot()

                this.pos.x += ((this.health / 10) * sin(this.angle)) * this.dir;
                this.pos.y += ((this.health / 10) * cos(this.angle)) * this.dir;

                this.pos.x = constrain(this.pos.x, 0 - width / 2, width / 2);
                this.pos.y = constrain(this.pos.y, 0 - height / 2, height / 2);

                for (let i in this.projectiles) {
                this.projectiles[i].update()

                if (this.projectiles[i].pos.x <= 0 - (width / 2) || 
                this.projectiles[i].pos.x >= (width / 2) || 
                this.projectiles[i].pos.y <= 0 - ((height / 2) * 1.5) || 
                this.projectiles[i].pos.y >= (height / 2)) {
                this.projectiles.splice(i, 1)
                }}}
            }
            useControls:true,
            vel:p5.Vector {p5: p5, x: 0, y: 0, z: 0},
        }
    }
}

这只是我尝试发送的一小部分,但是,这是导致错误的部分。

GitHub 上的完整代码

最佳答案

我弄清楚了问题所在:此错误仅在发送类实例时发生。通过从一个实例中提取数据并通过标准 JavaScript 对象文字发送它,然后将数据重新应用到一个单独的实例就可以了。

关于javascript - Socket.io - 发出 JS 对象导致最大递归错误,然后根本不发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49427526/

相关文章:

javascript - 如何通知用户有人在同一房间写作?

node.js - 当套接字与服务器断开连接时,如何从房间取消订阅套接字

javascript - Webpack(在产品中) bundle 给出错误 : TypeError: (0 , tm.useEffect) 不是一个函数...为什么?

javascript - 在页面重新加载时保持图像隐藏

javascript - 创建简单的 Node js 服务器和客户端

ajax - WebSockets 协议(protocol)与 HTTP

javascript - 过渡时背景无溢出

javascript - 单击删除/停止功能?

go - 发送带有标题文本的二进制数据

node.js - Socket.io限制数据包数量