从内部callback中断父代函数的执行

我为Unity3D创build了一个nodejs服务器,使用socketio进行networking连接。 我有一个作为比赛室的function,当玩家离开游戏时,我想离开这个function。 玩家每创build一个新房间,都应该进入该function并重新开始。 是否有可能从一个子callback中断父执行的function?

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 } 

编辑:忘了提及该function正在出口。 不知道这是否改变了一切。

编辑2:鉴于jfriend00答案中讨论的build议,我会给出一个更广泛的解释这个问题。

目前的stream量如下:

用户连接,我定义了一些“连接”callback函数。 相关的一个是startMatchMaker(Io, socket, data) 。 matchMaker为玩家创build一个空间(或者如果有空间的话join),然后继续执行前面提到的gameInit(io, socket, room, data)

gameInit(...)函数以空间为关键字将相关数据存储在全局数组中,例如Players[room] = {/* player object */} 。 比赛是1比1,所以当一个玩家放弃游戏时,我从arrays中删除条目,指的是房间: delete Players[room] 。 当玩家移动时,我更新玩家在全局数组内的物体位置。 这是在callback中完成的,在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中玩。 玩家2退出服务器放弃游戏。 玩家1仍然连接,但必须离开当前的游戏。 所有variables都被删除(如前所述),并且player1在room2中join一个新游戏。 当player1尝试移动时,将会调用2个callback函数:第一个initGame中room = "room1"添加的room = "room1" ,另外一个执行第二个callback函数时添加: room = "room2" 。 抛出exception是因为在key = room1玩家中没有条目。

鉴于此解决scheme是从先前的匹配中删除侦听器 。

你的“父母”function的概念有点混乱。 Javascript中没有“父function”。

看看你上面的例子,它看起来像在socket.oncallback函数内,你想做一些影响该函数外的代码。 这里要认识到的重要一点是它是一个callback函数 – 当套接字接收到一个标识为something的消息时,它调用callback函数。 没有涉及的父母/子女关系。

所以现在有一点更清楚了,让我们考虑一下你的问题。 你还没有解释你想在callback之外做什么,所以不清楚你想要停止什么function。 但是这不是非常重要的 – 基本上,你要做的就是在callback内部发生一些事件时, callback之外发送代码。 有很多方法可以做到这一点,但一个基本的技术是使用variables作为信号。

值得注意的是 ,node.js应用程序(通常)是事件驱动的。 这意味着你的代码几乎总是在callback正在发生的东西callback – 没有“主循环”,正在等待的东西发生。

所以你的代码可能看起来像这样:

 exports.initGame = function (userdata) { // do prematch stuff with userdata and execute game logic on // the callbacks // set up a variable to signal when something important happens var importantSignal = null; socket.on("something", function (someNetdata)({ // something important has happened! let the rest of the application know about it importantSignal = someNetdata.message; // do some other stuff related to the callback }); // another socket event socket.on("another", function (someNetData) { // has something important happened? if (importantSignal) { console.log("I see that 'something' has already happened!"); console.log("Message = " + importantSignal); } }); } 

这是callback之间传递消息的简单types – 注意第二个callback可以访问在第一个callback中设置的某个状态。 但是,第一个callback中的代码“控制”第二个callback是没有意义的,除非第二个callback根据第一个callback中设置的状态作出决定。

不可以。您不能停止执行子function中的父function。 您可以从子函数创build一个返回值,它将指示父函数接下来要执行的操作,然后父函数可以根据返回值pipe理自己。

但是,在你的例子中, initGame()是很长的,因为当socket.on('something, ...)被调用的时候, initGame()被执行socket.on('something, ...)所以你的整个问题都是错的。 实际上你的事件处理程序不能被调用,直到initGame()已经完成。 JS是单线程的,因此initGame()必须在调用任何事件处理程序之前完成执行。

这里的事件顺序如下:

  1. initGame()运行。
  2. 在运行时,它会设置事件处理程序来侦听各种套接字消息。 这些是事件处理程序,以响应将来发生的事件。
  3. initGame()然后完成执行。
  4. 然后,在将来的某个时间,会发生一个事件并且您的事件处理程序之一运行。 没有initGame()运行甚至试图破坏执行。

如果你想要更具体的帮助,你需要在你的socket.on('something', ...)事件处理程序中显示你实际上想要完成socket.on('something', ...) 。 从内部事件处理程序中“打破父函数的执行”的整个概念在Javascript中甚至没有意义。 这种情况在Javascript中不会发生。 在事件处理程序可以被调用之前,父函数已经执行完毕。 您将不得不显示您正在尝试解决的实际问题,以便我们更详细地帮助您。

有一件事情在这里看起来稍微有些麻烦,那就是你引用了socket ,但是并没有将它传递给initGame() ,但是你正在导出initGame()并从其他上下文中调用它,所以我们不清楚socketvariables可能是怎么样的variables。