我尝试修改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 语句。
这还允许您为未知事件定义"全部捕获"事件处理程序。