javascript - 如何传播主干 stopListening 以防止内存泄漏?

标签 javascript backbone.js memory-leaks marionette backbone-events

TLDR;对于 Backbone 事件,有没有办法在事件对象没有更多监听器时触发一些代码?

我有一个 Backbone Marionette View 正在监听 Model A 上的更改事件。完成 View 后,我调用 view.close() 这会导致它停止监听 Model A 上的所有事件。如果这个模型没有被其他任何东西引用,它现在可以被垃圾收集。

但是我的问题是 Model A 正在监听 Model B 上的更改事件,而 Model B 又监听来自 Web 套接字的实时更新。

因此,当Model A停止监听Model B时,它可以被释放,但Model B仍会保留在内存中,因为具有回调的 Web 套接字。添加 modelB.close() 方法不一定有效,因为其他对象可能仍在使用 Model B。但是,如果没有其他对象正在使用 Model B 的该实例,那么我希望它触发它的 stopListening 方法,然后该方法又会让 Web 套接字知道它可以当没有人再听它时关闭。

编辑: 基于答案的解决方案; https://gist.github.com/DomBlack/6885740 使用示例;

var BackboneExt = require('/path/to/gist');

var modelB = Backbone.Model.extend({
    initialize: function() {
        BackboneExt.autoCleanup(this);
    }
});

最佳答案

所有EventAggregators都是以这样的方式实现的,即某人拥有要在某些“事件”中执行的回调函数列表。如果一个对象公开了一个 EventAggregator API,这意味着它有效地提供了一个列表,任何人都可以在其中写入其姓名、电子邮件以及您想要联系的时间和方式的原因。通常,您不仅会收到 list 和笔,还需要填写一份登记表,然后由第三方处理,如果您通过了所有验证标准,您将被列入该 list 由第三人。如果您想从该列表中退订,也同样如此。

现在,谁有这份 list ?好吧,任何提供自己的 EventAggrigator API 的人都有这样的列表。因此,如果您的 modelB 向其他模块提供 EventAggregator API,则意味着它拥有包含所有订阅者的列表。如果该列表应该为空,则 modelB 可以检查哪个列表,它可以告诉其他人,例如你的 websocket 模块。

关于javascript - 如何传播主干 stopListening 以防止内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19245918/

相关文章:

c++ - 数组的内存泄漏 C++ 列表

c++ - 表示 2D 数据的 std::vector 中的内存泄漏

javascript - 如何从 postMessage() 调用异步返回值?

javascript - 伪造窗口调整大小,使所有仅调整大小的 JavaScript 加载

javascript - 使用nodejs,一个用户的更改可以同时反射(reflect)到其他用户

javascript - Backbone 模型中 console.log 之间的属性更改值

Javascript:不管我的表情是什么,RegExp 都不起作用

javascript - Marionette.js - 从 itemView 访问行为函数

javascript - 响应中嵌套对象的 Backbone model.set

java - 如何在 Java/Android 中查找内存泄漏