为什么在循环中广播到特定 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]
   });

但是它根本不会像这样向任何用户广播。这是为什么?

您不能将数组用作对象的键,这就是它不起作用的原因。同样在您当前的示例中,您只是将键 adminsmodsnonmods 设置为字符串,您没有使用实际变量值。

如果你想使用某种可以使用任何东西作为键的存储,你可以使用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,而知识在系统中具有单一表示。