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。」有人能夠點亮這裏發生的事情嗎?
的可能重複[Javascript腳本循環中的事件處理程序 - 需要封閉(http://stackoverflow.com/questions/341723/event-handlers-inside-a-javascript-loop-need-a-closure) – Pointy
檢查的其他問題,或當詢問「事件處理程序的JavaScript循環」只要有任何的問題 - 有相同的基本問題,許多變化。 – Pointy
你還不得不對付你的處理函數似乎是對對象「方法」的事實。你可能會需要到'.bind()'他們所涉及的對象,當你建立你的處理程序映射。 – Pointy