NodeJS, множественный доступ к одной и той же переменной - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь построить комнаты и группы с помощью веб-сокетов (я знаю, что есть 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.Они обновляют оригинал или получают копию в начале?Вы можете мне помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...