为什么在循环中广播到特定 ID 不起作用
Why broadcast to specific IDs wont work if in a loop
我有 3 种类型的用户:非模组、模组和管理员。我想相应地发出一个具有不同值的事件,所以我这样做了:
socket.broadcast.to(admins).emit('login', {
onlineusers: usersadmin
});
socket.broadcast.to(mods).emit('login', {
onlineusers: usersmod
});
socket.broadcast.to(nonmods).emit('login', {
onlineusers: usersnonmod
});
效果很好,但有点多余,所以为了节省代码,我尝试了这个:
let roles = {nonmods : usersnonmod, mods : usersmod, admins : usersadmin}
for(let rolename in roles) {
socket.broadcast.to(rolename).emit('login', {
onlineusers: roles[rolename]
});
但是它根本不会像这样向任何用户广播。这是为什么?
您不能将数组用作对象的键,这就是它不起作用的原因。同样在您当前的示例中,您只是将键 admins
、mods
和 nonmods
设置为字符串,您没有使用实际变量值。
如果你想使用某种可以使用任何东西作为键的存储,你可以使用Map
const map = new Map();
map.set(admins, usersadmin);
map.set(mods, usersmod);
map.set(nonmods, usersnonmod);
for (const [rooms, users] of map.entries()) {
socket.broadcast.to(rooms).emit('login', {
onlineusers: users
});
}
我个人不会那样做。原始代码做了它应该做的事情。它不是多余的,它只是在做需要做的事情。代码是 DRY,而知识在系统中具有单一表示。
我有 3 种类型的用户:非模组、模组和管理员。我想相应地发出一个具有不同值的事件,所以我这样做了:
socket.broadcast.to(admins).emit('login', {
onlineusers: usersadmin
});
socket.broadcast.to(mods).emit('login', {
onlineusers: usersmod
});
socket.broadcast.to(nonmods).emit('login', {
onlineusers: usersnonmod
});
效果很好,但有点多余,所以为了节省代码,我尝试了这个:
let roles = {nonmods : usersnonmod, mods : usersmod, admins : usersadmin}
for(let rolename in roles) {
socket.broadcast.to(rolename).emit('login', {
onlineusers: roles[rolename]
});
但是它根本不会像这样向任何用户广播。这是为什么?
您不能将数组用作对象的键,这就是它不起作用的原因。同样在您当前的示例中,您只是将键 admins
、mods
和 nonmods
设置为字符串,您没有使用实际变量值。
如果你想使用某种可以使用任何东西作为键的存储,你可以使用Map
const map = new Map();
map.set(admins, usersadmin);
map.set(mods, usersmod);
map.set(nonmods, usersnonmod);
for (const [rooms, users] of map.entries()) {
socket.broadcast.to(rooms).emit('login', {
onlineusers: users
});
}
我个人不会那样做。原始代码做了它应该做的事情。它不是多余的,它只是在做需要做的事情。代码是 DRY,而知识在系统中具有单一表示。