javascript - 我应该如何处理要删除的对象的事件处理程序?

标签 javascript node.js

我想知道处理注册了事件处理程序的对象的正确且最简单的方法是什么。

让我们举个例子:

const mqtt = require('mqtt')
var users = []

function createClient(){
var user = { 'name': 'barney', 'age': 36, 'client': client: mqtt.connect('mqtt://127.0.0.1'), 'active': false }
user.client.on("message",messageHandler.bind(user))
users.push(user)
}

function messageHandler(topic, message){
console.log(`'User' ${this.name} received ${message} on ${topic}`)
}

createClient()
delete users[0].client
users = []

现在客户端对象消失了,但事件处理程序似乎仍然存在,因为我现在因用户未定义而抛出错误。

我假设垃圾收集器会处理不再存在的对象的事件处理程序。

编辑:看来我简化得太多了。我更改了代码以反射(reflect)实际存在的对象。 mqtt 来自mqtt.js

看来对象的作用/是什么很重要。我希望得到一个能够解释原因的答案,因为它似乎与我遇到问题的原因非常相关。我不需要帮助来修复我的代码,我想更好地了解对象和事件处理程序如何工作以及垃圾收集如何处理。从迄今为止我阅读的资源来看,我所得到的行为似乎让我感到困惑。

最佳答案

如果您经常这样做,您可以创建自己的函数来处理这种情况。例如:

const unbindAndDelete = (element, event = 'bark', handler = 'barkHandler') => {
  element.removeEventListener(event, handler);
  delete element;
}

但请务必向其传递一个要删除的有效元素,即对象属性。 Javascript 不会让你对变量执行此操作。

关于javascript - 我应该如何处理要删除的对象的事件处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52276074/

相关文章:

javascript - AdonisJs 可以用于 REST APIS 吗?

javascript - 保存后,nodemon 每隔一秒就会启动服务器并出现错误

javascript - 'this' 属性的值在 nodeJS 上未定义

javascript - Jeditable插件开发

javascript - 如何在 Google Maps V3 的每条折线段上绘制箭头

javascript - 当标题滚动到边界附近时,DataTables ColReorder 滚动

node.js - 异步 I/O 和异步函数有什么区别?

javascript - 如何查找使用 AJAX 操作的项目的多个 .change() 事件

php - jQuery 将每个 PHP 响应视为状态为 0

node.js - 如何在CubeJS的JSON查询中按度量返回COUNT条记录