NodeJS,对同一个变量的多重访问

时间:2018-12-18 09:38:20

标签: javascript node.js websocket

我正在尝试使用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进行不同的承诺/回调。他们是更新原始版本还是在开始时获得副本? 你能帮我吗?

0 个答案:

没有答案