为什么socket.on()被多次调用

时间:2019-06-07 09:51:55

标签: javascript socket.io

我正在用socket.io做一个小游戏。

服务器端代码(app.js)在Node上运行...

客户端代码在game.js中

在app.js内部,我有

app.get("/playgame", (req, res) => {
    res.sendFile(__dirname + "/public/game.html");

});

游戏设置: 默认情况下,玩家1将成为挑战者。 Player-2接受了挑战。

io.on('connection', (socket) => {

    socket.on('createChallenge', function(data) {
       let obj = {
            id: getroomID(),
            players: [{ sock: socket.id, name: data.player1.toLowerCase() }]
        };

        if (io.sockets.mygameChallenges) {
            io.sockets.mygameChallenges.push(obj);

        } else {
            let rooms = [];
            rooms.push(obj);
            io.sockets.mygameChallenges= rooms;
        }


        socket.emit("chalengecreated", { player: data.player1, id: obj.id });
});

一切正常,直到这里。

输入错误的游戏ID后,我遇到了这个问题

1)Player-2收到输入错误ID的警报消息(这很完美)

2)如果P-2再次输入错误的游戏ID,这次将收到两条警报消息。

3)如果是第三次输入不正确的游戏ID,则会收到3条警告消息...

这是一段被多次调用的代码

Game.js:

socket.on('errorID', function(data) {
// this gets called multiple times. Not sure why
         if (data.error) {
             console.log(data.rooms);
             alert(data.error);
         } else {
             alert(data);
         }

     });

App.js:

 if (!matched) {
            console.log('ID not found'); // This gets called only once as expected.
             socket.emit('errorID', { error: "ID not found", rooms: io.sockets.mygameChallenges});
                }

1 个答案:

答案 0 :(得分:0)

我找到了原因。

socket.on()事件句柄在每次玩家输入不正确的ID并单击按钮时都会进行设置。

解决方案: 我使用了布尔值,以便当播放器首次输入不正确的ID时,会设置on()事件。从第二次起,将不再设置on(),因为布尔值现在为false