我正在爲網絡使用socketio創建Unity3D的nodejs服務器。我有一個作爲比賽室的功能,當球員離開比賽時我想離開這個功能。每次玩家創建一個新房間時,都應該輸入該功能並重新開始。是否有可能從子回調中中斷父函數的執行?從內部回調中斷父執行功能
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「連接」回調某些功能。相關的是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在會議室1播放。玩家2退出服務器放棄遊戲。玩家1仍然連接,但必須離開當前的遊戲。所有變量都被刪除(如前所述),player1加入room2中的新遊戲。當player1嘗試移動時,將會調用2個回調函數:第一個initGame中添加的回調函數爲room = "room1"
,另一個執行第二個匹配項後添加:room = "room2"
。拋出異常是因爲玩家沒有輸入key = room1
。
鑑於此,解決方案是從之前的比賽中獲得remove the listeners。
方式堆棧溢出被設計用於工作,您不應該根據提供的答案繼續使用漸進式發現來編輯問題。這是一個問答網站。您提出了一個問題(可以隨時編輯以澄清),我們提供了一個答案。當你從答案中獲得信息時,你不會繼續發展這個問題。這不是一個線程討論網站,我們將討論您正在發展的問題。你問一個明確的問題,我們爲這個問題提供了一個答案。你問的問題不應該改變。你可以澄清原來的問題。 – jfriend00
如果在回答您的原始問題後,您還有其他問題出現在您學到的東西之後,那麼您會另外提出另一個問題。 – jfriend00
此外,試圖描述代碼如何工作的所有文本對於讀者來說太複雜了。只需顯示實際的代碼(幾行代碼值得一百行文本),然後在文本中描述這個代碼的目標(您要完成的內容)。 – jfriend00