Задать вопрос
@Caelwyn

Как добиться удаления объекта в JS?

Принялся за изучение JS, решил начать с простого чата. Собственно возникла проблема.
Итак, у меня есть объект ChatServer, в котором реализуется создаётся объект socket.io, и реализуется работа с подключением и отключением клиентов.
"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;


При подключении клиента создаётся объект Client, в котором реализуется обработка сообщений, для этого, конкретного клиента.
"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;


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

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

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

Я, видимо, не до конца понимаю механику прибивания объектов, знаю что для этого нужно удалить все ссылки на него, что, тут и сделано.
clients[socket.id] = undefined;
                delete clients[socket.id];

Однако, судя по всему, этого мало. Вот собственно и вопрос - что можно сделать с этим?
  • Вопрос задан
  • 285 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
clients[socket.id] = undefined;
delete clients[socket.id];

Тут два раза делаете одно и тоже действия.

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

Все правильно, потому что в конструкторе клиента вы подписались на событие:
this.app.on('chat.sendMessage', this.sendMessage.bind(this));

но забыли отписаться при диссконнекте.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Ivanq
@Ivanq
Знаю php, js, html, css
Как минимум,
clients[socket.id] = undefined;
delete clients[socket.id];

не может. Этим Вы удаляете . Надо убрать первую строку:
delete clients[socket.id];
Ответ написан
Комментировать
pm_wanderer
@pm_wanderer
junior-HTML
А в джаваскрипте точно можно удалить обьект убрав на него все ссылки?
Такое вроде работает в ARC только
Если в js сборщик мусора отвечает за обьекты, то скорее всего он сам будет удалять их.
А то что обьект продолжает ловить сообщения, то видимо надо при отключении ему запретить это делать иным способом, кроме удаления
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы