怀疑是专业的Node.js代码

时间:2014-02-09 04:18:07

标签: javascript node.js sockets chatroom

这直接取自Professional Node.js一书。我理解代码的逻辑,但我不明白“oldroom”出现在哪里!第二行对我来说很困惑。在这里,我们希望将套接字与房间相关联。套接字还没有加入房间所以在第二行为什么我们要做socket.get('room',.....)。我们可以省略第2行和第3行吗?

    socket.on('join', function(room) {
    socket.get('room', function(err, oldRoom) {
      if (err) { throw err; }

      socket.set('room', room, function(err) {
        if (err) { throw err; }
        socket.join(room);
        if (oldRoom) {
          socket.leave(oldRoom);
        }
        socket.get('username', function(err, username) {
          if (! username) {
            username = socket.id;
          }
        });
        socket.emit('serverMessage', 'You joined room ' + room);
        socket.get('username', function(err, username) {
          if (! username) {
            username = socket.id;
          }
          socket.broadcast.to(room).emit('serverMessage', 'User ' + 
            username + ' joined this room');
        });
      });
    });
  });

1 个答案:

答案 0 :(得分:0)

  

我不明白“旧房”出现在哪里!

oldRoom出现”或被声明为从第二行开始的回调function的命名参数:

socket.get('room', function(err, oldRoom) {
//                               ^^^^^^^

socket.get()最终调用此function时,将确定其值。


  

我们可以省略第2行和第3行吗?

可能不是。

该代码段在向room提出请求时似乎将用户限制为单个'join'

socket.on('join', function(room) {
    // ...
});

第2-3行将用户的当前'room'检索为oldRoom

socket.get('room', function(err, oldRoom) {
  if (err) { throw err; }

  // ...
});

并且,如果他们实际上在oldRoom,那么他们将会.leave()

    if (oldRoom) {
      socket.leave(oldRoom);
    }

.join()已请求的room,更新'room'下一个'join'请求:

  socket.set('room', room, function(err) {
    if (err) { throw err; }
    socket.join(room);

    // ...
  });