Я пытаюсь построить комнаты и группы с помощью веб-сокетов (я знаю, что есть socket.io, но я должен использовать собственные веб-сокеты)
Мне интересно, как я могу безопасно обновлять массив групп:Это выглядит так:
let socketStore = {10:[ws1, ws2], 20:[ws3, ws3]}
10 и 20 - это идентификаторы групп, а веб-сокеты хранятся внутри массивов.
Представьте себе этот код для сокета, закрывающего его соединение:
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)
}
})
Итак, я перебираю все идентификаторы групп и проверяю, является ли пользователь членом этой группы.Кроме того, я проверяю, остался ли только один участник, поэтому я могу удалить ключ группы.Но если после этого if(socketStore[groupId].length === 1)
другой сокет подключается и добавляется в массив?Но тогда массив все равно будет удален, хотя внутри сейчас два пользователя.Или объект socketStore
внутри этого if-условия является просто копией глобального?
Могу ли я быть уверен, что внутри этого if-условия socketStore
не изменилось?
Я не знаю, как NodeJS обрабатывает такого рода множественный доступ к одной и той же переменной.
Кроме того, как насчет различных обещаний / обратных вызовов, обновляющих socketStore
.Они обновляют оригинал или получают копию в начале?Вы можете мне помочь?