2016-01-27 3 views
1

В настоящее время я добавляю объект клиента WebSocket к массиву, чтобы я мог сопоставить его (по индексу) с другим массивом информации о пользователе, чтобы определить, какой пользователь принадлежит к тому клиенту/сокету/сеансу.Как удалить объект WebSocket из массива JavaScript?

var users = []; 
var clients = []; 
... 
wss.on('connection', function connection(ws) { 

    clients.push(ws); 
    var i = clients.indexOf(ws); 
    if(i > -1) { 
     users.push({ 
     id: i, 
     user: "", 
     room: "", 
     client: clients[i], 
    }); 
    } 

    ws.on('close', function(ws) { 
     var i = clients.indexOf(ws); //i = -1 
     if(i > -1) { 
      // remove this client and user... 
     } 
    }); 

    ws.on('message', function incoming(message) { 
     // do stuff 
    }); 
}); 

Я могу получить индекс ws объекта (который возвращает 0), так что я могу вставить объект как часть объекта JSON на «пользователь» массив штраф. Но когда я пытаюсь удалить тот же объект ws, когда соединение закрыто, возвращается -1 для indexOf(ws). Но, конечно же, он должен возвращать 0, поскольку это тот же объект (соединение), который использовался ранее, и все еще присутствует в индексе 0 в массиве клиентов?

Почему indexOf() возвращает -1 в обработчике «close»?

ответ

1

Слушатель событий close не получает WebSocket в качестве своего первого аргумента, если вы используете модуль ws в узле. docs say the first argument is closing code reason, а не сокет.

Вместо этого у вас уже есть гнездо во внешней переменной ws. Не затушевывайте его аргументом с именем ws, и ваш код должен работать нормально:

ws.on('close', function(code, message) { 
    var i = clients.indexOf(ws); 
    //... 
}); 
Смежные вопросы