2013-10-02 6 views
1

Я сделал некоторые вещи, чтобы сжать мой код socket.on().Node.js и Socket.io - Dynamic socket.on()

В этом контексте я уже получаю сокет клиента с

... 
var io = require('socket.io').listen(...); 
io.sockets.on('connection', function(socket) { 
    // my code for this client 
    ... 
}); 

Прежде чем я имел этот

socket.on('event1', function(args1) {callback1(args1);}); 
socket.on('event2', function(args2) {callback2(args2);}); 
... 
socket.on('eventN', function(argsN) {callbackN(argsN);}); 

Теперь у меня есть


    var events = { 
     event1: 'callback1', 
     event2: 'callback2', 
     ... 
     eventN: 'callbackN' 
    }; 
    for(var event in events) { 
     var callback = events[event]; 
     socket.on(event, function() { 
      this[callback].apply(this, arguments); 
     }); 
    } 

Оказывается, что функция callbackN является всегда звоните. Когда event1 является триггером с args1, callbackN является вызовом с args1, когда event2 является триггером с args2, callbackN - это вызов с args2.

Что не так?

+1

Что 'this'refer к? – warchimede

+0

'this' ссылаются на класс, весь этот код работает в том же классе/пространстве имен. – Typhon

ответ

0

Это должно работать:

var events = { 
    event1: 'callback1', 
    event2: 'callback2', 
    ... 
    eventN: 'callbackN' 
}; 

var setCB = function(ev) { 
    var callback = events[ev]; 
    socket.on(event, function() { 
     this[callback].apply(this, arguments); 
    }); 
}; 

for (var event in events) { 
    setCB(event); 
} 

Странная или не интуитивное поведение, которое вы видите хорошо объясняется этим blog post.

Надеюсь, это поможет.

Смежные вопросы