我正在尝试使用websockets构建房间和组(我知道有socket.io,但是我必须使用本地websockets)
我想知道如何安全地更新组数组:看起来像这样:
let socketStore = {10:[ws1, ws2], 20:[ws3, ws3]}
10和20是组ID,WebSocket存储在数组中。
想象一下这段代码,该套接字用于关闭其连接:
ws.on("close", ()=>{
let userId = ws.userId;
try{
Object.keys(socketStore).forEach((groupId)=>{
if(socketStore[groupId].length === 1){
//what if after that a user joined again?
delete socketStore[groupId];
console.log("delete group key")
}else{
let index = socketStore[groupId].findIndex(ws => ws.userId ===userId)
if(index != -1){
socketStore[groupId].splice(index, 1)
console.log("delete user socket")
}
}
})
}catch(err){
console.log(err)
}
})
因此,我遍历所有组ID,并检查用户是否是该组的成员。此外,我检查是否只剩下一个成员,所以我可以删除组密钥。但是,如果在那个if(socketStore[groupId].length === 1)
之后又有另一个套接字连接并添加到了阵列中?但是,尽管现在内部有两个用户,但仍将删除该阵列。还是该if条件中的对象socketStore
仅是全局对象的副本?
我可以确定在该if条件内,socketStore
没有改变吗?
我不知道NodeJS如何在同一个变量上处理这种多重访问。
此外,如何更新socketStore
进行不同的承诺/回调。他们是更新原始版本还是在开始时获得副本?
你能帮我吗?