2013-01-19 56 views
0

我做在node.js中的服務器(與socket.io),而這個具體的問題已經困擾,現在我的時間最長。我爲套接字連接創建了一個易於擴展的處理程序,以將每個不同的連接路由到不同的功能。如何將變量和引用存儲在JavaScript中的匿名函數中?

... <previous code> ... 
var socketHandlers = { 
         'chat':chat.onMessage, 
         'chatNameRequest':chat.onNameRequest, 
         'changeRooms':commands.onPlayerRoomChange, 
         'commandEnter':commands.onCommandEnter 
        }; 

io.sockets.on('connection', function (socket) { 
    console.log("New client connected."); 

    // add all handlers to this socket when connected 
    for (var handler in socketHandlers) { 
     socket.on(handler, function(data) { 
      console.log("Resolved handler for " + handler + ", called function " + socketHandlers[handler]); 

      // sanitize each handler before sending it to the inner functions 
      // leave more specific sanitization for the inner function 
      data = valid.cleanData(data); 
      socket = valid.cleanSocket(socket); 

      // finally send it to the inner functions 
      socketHandlers[handler](socket, data); 
     }); 
    } 
}); 

但是,它似乎並沒有工作。這是從服務器的控制檯輸出:

debug - flashsocket received data packet 5:::{"args":{"name":"Timothy"},"name":"chatNameRequest"} 
Resolved handler for commandEnter, called function function (socket, data) { 
<function contents, etc> 

正如你可以看到,該方案獲得「chatNameRequest」的要求,但它正確地路由到「commandEnter。」有人能夠點亮這裏發生的事情嗎?

+0

的可能重複[Javascript腳本循環中的事件處理程序 - 需要封閉(http://stackoverflow.com/questions/341723/event-handlers-inside-a-javascript-loop-need-a-closure) – Pointy

+0

檢查的其他問題,或當詢問「事件處理程序的JavaScript循環」只要有任何的問題 - 有相同的基本問題,許多變化。 – Pointy

+0

你還不得不對付你的處理函數似乎是對對象「方法」的事實。你可能會需要到'.bind()'他們所涉及的對象,當你建立你的處理程序映射。 – Pointy

回答

相關問題