首页 > 解决方案 > 我应该如何处理要删除的对象的事件处理程序?

问题描述

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

让我们举这个例子:

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 = []

现在客户端对象不见了,但事件处理程序似乎还活着,因为我现在收到一个错误,因为用户未定义。

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

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

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

标签: javascriptnode.js

解决方案


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

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

但一定要传递给它一个有效element的删除,即一​​个对象属性。Javascript 不会让你对变量执行此操作。


推荐阅读