2016-01-05 2 views
0

Я решил начать с простого чата. На самом деле была проблема. Итак, у меня есть объект ChatServer, который реализует объект, созданный socket.io, и работает с подключением и отключением клиентов.Как удалить объект в Node.JS?

"use strict"; 

var SocketServer = require('socket.io') 
    , Client = require('./Client.js'); 

class ChatServer { 
    constructor(app, http) { 
     var io = SocketServer(http) 
      , clients = {}; 

     io.on('connection', function(socket) { 
      console.log('Client ' + socket.id + ' connected'); 

      clients[socket.id] = new Client(app, socket); 

      socket.on('disconnect', function() { 
       console.log('Client ' + socket.id + ' disconnected'); 

       clients[socket.id] = undefined; 
       delete clients[socket.id]; 
      }); 
     }); 
    } 
} 

module.exports = ChatServer; 

При подключении клиентского объекта создается Клиент, который выполняет обработку сообщений для этого конкретного клиента.

"use strict"; 

class Client { 
    constructor(app, socket) { 
     this.app = app; 
     this.socket = socket; 

     this.app.on('chat.sendMessage', this.sendMessage.bind(this)); 
    } 

    sendMessage(message) { 
     console.log('Client ' + this.socket.id + ' on chat.sendMessage'); 
     this.socket.emit('chat.sendMessage', message); 
    } 
} 

module.exports = Client; 

приложение - это EventEmitter, откуда приходят периодически «chat.sendMessage» сообщения (для тестирования), в объектах клиента, сообщения принимаются и направляются в браузере.

Однако, если клиент отключен, клиентский объект не уходит и продолжает ловить сообщения и отправлять их в отсоединенный сокет.

Client ZbEFj8ykXba9CxLiAAAA connected 
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage 
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage 
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage 
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage 
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage 
Client ZbEFj8ykXba9CxLiAAAA disconnected 
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage 
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage 
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage 
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage 

я, вероятно, не в полной мере понять механику destroing объектов, я знаю, что ему нужно, чтобы удалить все ссылки на него, что здесь и сделано.

clients[socket.id] = undefined; 
delete clients[socket.id]; 

Однако это не работает. Что я делаю не так?

ответ

1

вам не нужно назначить неопределенные к элементу массива, будет неопределенным после удаления как

delete clients[socket.id]; 

на самом деле, когда вы используете ключевое слово уага он присоединять переменную текущую область под названием «VariableEnvironment»

попробуйте избегать ключевого слова var в данном конкретном случае.

для получения дополнительной информации http://www.ecma-international.org/ecma-262/5.1/

Смежные вопросы