TLDR; С событиями с базой, есть ли способ запускать некоторый код, когда объект события не имеет больше слушателей?Как распространять опорную стоп-систему для предотвращения утечек памяти?
У меня есть манекен Магистраль Просмотр прослушивания изменений событий на Model A
. Когда я закончил просмотр, я вызываю view.close()
, что заставляет его прекратить слушать все события на Model A
. Если на эту модель не ссылаются ни на что другое, теперь это может быть сбор мусора.
Однако моя проблема заключается в том, что Model A
слушает изменения событий на Model B
, который, в свою очередь, слушает обновления в реальном времени из веб-сокета.
Поэтому, когда Model A
останавливает прослушивание Model B
, его можно отпустить, но Model B
по-прежнему будет храниться в памяти из-за того, что сетевая розетка имеет обратный вызов. Добавление метода modelB.close()
не обязательно работает, поскольку другие объекты все еще могут использовать Model B
. Но если никакой другой объект не использует этот экземпляр Model B
, я бы хотел, чтобы он вызывал его метод stopListening
, который затем, в свою очередь, позволял веб-сокету знать, что он может закрыть, когда его больше не слушают.
Редактировать: Решение основано на ответе; https://gist.github.com/DomBlack/6885740 Пример использования;
var BackboneExt = require('/path/to/gist');
var modelB = Backbone.Model.extend({
initialize: function() {
BackboneExt.autoCleanup(this);
}
});
Модели Backbone расширяют класс Events, так как у такой модели B уже есть список обратных вызовов, которые он может проверить. Проблема заключается в том, чтобы знать, когда проверять этот список; поскольку функция 'off' в' Backbone.Events' не вызывает событие callbackRemoved. – Phenix
Вы должны расширить метод 'Backbone.Events''' off' с триггером, который запускается, когда (1) выполняется метод 'off' и (2) список содержит 0 записей. Чтобы зарегистрировать эту функцию обратного вызова, вам необходимо прикрепить ее как свойство к тому, к чему имеют доступ как «Backbone.Events», так и «modelB». –
Я как бы надеялся, что кто-то уже расширил Магистраль, но я создал решение; https://gist.github.com/DomBlack/6885740 – Phenix