1

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); 
    } 
}); 

ответ

1

Все EventAggregators реализованы таким образом, что кто-то обладает список функций обратного вызова, которые должны быть выполнены в определенных «событий». Если объект предоставляет API EventAggregator, это означает, что он эффективно предлагает список, в который каждый может написать свое имя и адрес электронной почты, а также причину, по которой и как вы хотите связаться. Как правило, вы не просто передаете список и ручку, но вам необходимо заполнить регистрационную форму, которая затем будет обработана третьим лицом, и если вы пройдете все критерии проверки, вы попадете в этот список этим третьим лицом. То же самое, если вы хотите отказаться от подписки на себя из этого списка.

Теперь у кого есть этот список? Ну, у любого, предлагающего свой собственный EventAggrigator API, есть такой список. Поэтому, если ваш модельB предлагает API EventAggregator для других модулей, это означает, что у него есть список со всеми подписчиками. Если этот список должен быть пустым, какой modelB может проверить, он может пойти и сказать кому-то еще, например. ваш веб-модуль.

+0

Модели Backbone расширяют класс Events, так как у такой модели B уже есть список обратных вызовов, которые он может проверить. Проблема заключается в том, чтобы знать, когда проверять этот список; поскольку функция 'off' в' Backbone.Events' не вызывает событие callbackRemoved. – Phenix

+1

Вы должны расширить метод 'Backbone.Events''' off' с триггером, который запускается, когда (1) выполняется метод 'off' и (2) список содержит 0 записей. Чтобы зарегистрировать эту функцию обратного вызова, вам необходимо прикрепить ее как свойство к тому, к чему имеют доступ как «Backbone.Events», так и «modelB». –

+1

Я как бы надеялся, что кто-то уже расширил Магистраль, но я создал решение; https://gist.github.com/DomBlack/6885740 – Phenix