我没有成功修改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函数的等价物。
非常感谢你的帮助。
答案 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"未知事件的事件处理程序。