Websocket HTML5 创建类似于 socket 的 onmessage 函数.IO .on 函数



我尝试修改WebSocket.onmessage函数以便能够动态添加开关大小写,但没有成功:

socket.onmessage = function (event) {
  let message = JSON.parse(event.data) 
  switch(event.type) { 
  case "UPDATE_USER": 
    // update user
  case "UPDATE_FOO": 
   // update FOO
  case "UPDATE_BAR": 
  // update FOO
}

Socket.IO 正在做我试图用 .on 函数实现的事情:

socket.on('ADD_NEW_DYNAMIC_CASE', (data) => {
  // update socket with another action case
});

Socket.io 能够通过将侦听器添加到您将收到的任何 message.type 来更新等效的 onmessage 函数。

非常感谢您的帮助。

如果您需要将

大小写动态添加到 switch 语句中,则最好使用 map 模式而不是 switch 语句。

switch 语句不能动态更新(无需元编程和重写整个函数(,而映射模式的实现非常简单。

考虑一下:

socket = {};
socket.onmessage = function (event) {
  try {
    var message = JSON.parse(event.data);
    if(this[message.type] && (typeof this[message.type] == "function"))
      this[message.type](message);
    else
      console.error("Unknown event:", message);
  }
  catch(error) {
    console.error("Invalid JSON", error, event);
  }
}.bind(socket)
// example: 
socket.fire = (msg) => { console.log( "I'm on fire!" ); }
socket.onmessage({data: "{"type": "fire"}"});

这种方法将允许您通过定义处理事件的函数来动态添加事件,而无需担心 switch 语句。

这还允许您为未知事件定义"全部捕获"事件处理程序。

最新更新