【问题标题】:How to remove the object in Node.JS?如何删除 Node.JS 中的对象?
【发布时间】:2016-01-05 08:48:33
【问题描述】:

我决定从简单的聊天开始。其实有问题。 所以,我有一个对象 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;

当连接客户端对象时,会为这个特定的客户端创建客户端,实现消息处理。

"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”(用于测试),在客户端对象中,消息被接收并发送到浏览器。

但是,如果客户端断开连接,客户端对象并没有消失,而是继续捕获消息并发送到断开连接的套接字。

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];

但是,这不起作用。我做错了什么?

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

    你不需要将 undefined 分配给数组元素,一旦你删除它就会是 undefined

    delete clients[socket.id];
    

    实际上,当您使用 var 关键字时,它会附加名为“VariableEnvironment”的变量当前范围

    在这种特殊情况下尝试避免使用 var 关键字

    更多信息http://www.ecma-international.org/ecma-262/5.1/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-25
      • 2016-10-26
      • 2015-07-18
      • 1970-01-01
      • 2012-08-06
      • 2012-04-08
      • 2015-06-17
      • 1970-01-01
      相关资源
      最近更新 更多