0

这直接取自 Professional Node.js book。我理解了代码的逻辑,但我不明白“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');
        });
      });
    });
  });
4

1 回答 1

0

我不明白“oldroom”是从哪里出现的!

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

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

它的值将在socket.get()最终调用 this时确定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);

    // ...
  });
于 2014-02-09T06:26:14.730 回答