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

时间:2018-04-18 14:29:32

标签: javascript websocket frontend

我没有成功修改WebSocket.onmessage函数,因为它可以动态添加一个switch case:

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函数的等价物。

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

如果您需要将案例动态添加到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语句。

这也可以让你定义一个" catch-all"未知事件的事件处理程序。