【发布时间】:2016-04-08 03:31:47
【问题描述】:
我正在尝试使用 nodejs 构建一个简单的聊天服务器(练习)。我有一个全局变量 chatRooms,它可以被服务器的所有请求更改或读取。我想弄清楚我是否可能导致一些比赛条件。我还通过节点网络模块使用套接字。
var net = require('net');
var chatRooms = {fender:[]};
function enterRoom(socket, room){
charRooms[room].push(socket.username);
}
function leaveRoom(socket, room){
var indexOfUser = chatRooms[room].indexOf(socket.username);
chatRoom[room].splice(indexOfUser, 1);
}
所以,我试图弄清楚这种情况: 用户 A 加入聊天室 fender: - chatRoom 看起来像 {fender:['A']} 用户 B 加入聊天室 fender: - chatRoom 看起来像 {fender:['A', 'B']}
用户 B 和 A 想要离开房间,同时这样做: 用户 B indexOfUser === 1; 用户 A indexOfUser === 0; 用户 A 在用户 B 之前拼接了 chatRooms gobal var。 全局 ChatRoom 变量现在看起来像 (fender:['B']} 用户 B indexOfUser 不再 === 1 所以当用户 B 拼接 ChatRooms 时,它会使用错误的索引。
这样的事情是否可能,或者节点的单线程特性阻止了这种情况的发生。
想不通的是这两行代码会不会有问题
var indexOfUser = chatRooms[room].indexOf(socket.username);
// another request alters charRooms before the next line of code is reached.
chatRoom[room].splice(indexOfUser, 1);
【问题讨论】:
标签: node.js sockets asynchronous