我正在为Unity3D创建一个nodejs服务器,使用socketio进行网络通信。我有一个用作匹配房间的函数,当玩家离开游戏时,我希望离开该函数。每次玩家创建新房间时,它应该进入该函数并重新开始。是否可能从子回调中中断父函数的执行?
exports.initGame = function (userdata) {
//do prematch stuff with userdata and execute game logic on the callbaks
socket.on("something", function (someNetdata)({
// how do i stop parent function from here?
});
// more socket.on callbacks
}
编辑:忘记提到该函数正在被导出,不知道这会改变什么。
编辑2:鉴于jfriend00回答中讨论的建议,我将更详细地解释问题。
当前流程如下:
用户连接后,在 Io“connected”回调上定义一些函数。其中一个相关函数是startMatchMaker(Io, socket, data)
。MatchMaker 为玩家创建房间(如果有可用房间,则加入其中),然后执行之前提到的gameInit(io, socket, room, data)
。
gameInit(...)
函数使用房间作为关键字在全局数组中存储相关数据,例如:Players[room] = {/* player object */}
。比赛是1对1的,因此当一名玩家放弃比赛时,我会从数组中删除与房间有关的条目:delete Players[room]
。当玩家移动时,我会在全局数组中更新其对象中的玩家位置。这是通过在gameInit(...)
中添加的回调函数完成的。
socket.on("move", function(data){
//do movement logic and update player position, if it is valid. Omitting the rest of the code.
Players[room].position = data.position;
});
现在假设有两个玩家,player1和player2正在room1中进行游戏。 Player2通过退出服务器来放弃游戏。 Player1仍然连接着,但必须离开当前的游戏。 所有变量都被删除了(如上所述),并且player1加入到room2的新游戏中。 当player1尝试移动时,将调用2个回调函数:第一个是在
room =“room1”
的first initGame中添加的,另一个是在执行第二次匹配时添加的:room =“room2”
。 因为Players中没有具有key = room1
的条目,所以会抛出异常。
解决方案是从前一次比赛中删除侦听器。