编程语言
首页 > 编程语言> > javascript-socket.io,动态添加消息处理程序

javascript-socket.io,动态添加消息处理程序

作者:互联网

我已经愉快地编写了一个node.js服务器,该服务器使用socket.io与客户端进行通信.
这一切都很好.
socket.on(‘connection’…)处理程序有点大,这让我想到了一种组织代码并将处理程序添加到生成器函数中的替代方法,如下所示:

sessionSockets.on('connection', function (err, socket, session) {
  control.generator.apply(socket, [session]);
}

生成器采用一个包含套接字事件及其相应处理函数的对象:

var config = {
  //handler for event 'a'
  a: function(data){
    console.log('a');
  },

  //handler for event 'b'
  b: function(data){
    console.log('b');
  }
};


function generator(session){

  //set up socket.io handlers as per config
  for(var method in config){
    console.log('CONTROL: adding handler for '+method);

    //'this' is the socket, generator is called in this way
    this.on(method, function(data){
      console.log('CONTROL: received '+method);
      config[method].apply(this, data);
    });
  }
};

我希望这可以将套接字事件处理程序添加到套接字中,这确实可以做到,但是当发生任何事件时,它总是调用最新添加的事件,在这种情况下始终是b函数.

任何人都知道我在这里做错了什么吗?

解决方法:

出现问题的原因是,到那时this.on回调触发了(假设您绑定它后几秒钟),for循环完成并且方法变量成为最后一个值.

要解决此问题,您可以使用一些JavaScript魔术:

//set up socket.io handlers as per config
var socket = this;
for(var method in config){
  console.log('CONTROL: adding handler for '+method);

  (function(realMethod) {
    socket.on(realMethod, function(data){
      console.log('CONTROL: received '+realMethod);
      config[realMethod].apply(this, data);
    });
  })(method);  //declare function and call it immediately (passing the current method)
}

当您第一次看到它时,这种“魔术”很难理解,但是当您得到它时,事情就变得很清楚了:)

标签:node-js,socket-io,javascript
来源: https://codeday.me/bug/20191122/2057366.html