Замыкания Javascript и проблема * статических * классов
-
27-10-2019 - |
Вопрос
У меня есть статический класс, который содержит массив функций обратного вызова, затем у меня есть несколько других классов, которые используются для взаимодействия с этим статическим классом ...
Вот простой пример статического класса:
родовое словоВот пример других моих классов, которые с ним взаимодействуют:
родовое словоТеперь у меня есть проблема в том, что когда я вызываю любой из классов и сообщаю ему активироватьCallbacks (), классы активируют обратные вызовы только в пределах их собственной области видимости, т.е. SomeClassOne будет вызывать someCallback (), но не someOtherCallback (), и наоборот, теперь Я предполагаю, что это как-то связано с объемом закрытий, однако я не уверен, как добиться того же поведения, которое мне нужно ...
Я попытался превратить статический класс в обычный класс, а затем передать его в 2 класса через конструктор, но все равно получил ту же проблему ...
Итак, мой вопрос в том, как заставить классы вызывать все обратные вызовы
- РЕДАКТИРОВАТЬ -
Вот пример, отображающий ту же проблему, что и в моем реальном приложении. Я поместил весь код сценария на страницу, чтобы дать более ясный пример:
http://www.grofit.co.uk/other/pubsub- test.html
Это простое приложение с 2 докладчиками и 2 представлениями ... одно представление связано с добавлением двух чисел вверху страницы, второе представление связано с получением этой суммы, умножением ее и отображением результата.
Я использую стороннюю библиотеку PubSubJS , и первый докладчик прислушивается к событию, чтобы рассказать Это значит, что один из полей изменился и пересчитывает верхнюю строку. Второй ведущий слушает, когда изменяется умножение или сумма вверху, а затем пересчитывает нижний. Теперь первый докладчик пересчитывает правильно, а второй докладчик будет правильно пересчитывать каждый раз при изменении поля умножения, ОДНАКО! Он НЕ пересчитывается при изменении суммы вверху, даже если он должен получить уведомление ...
В любом случае бегло просмотрите исходный код на странице, чтобы понять, что я имею в виду ...
Решение
Во-первых, я думаю, вам нужен var callbacks= [] (массив вместо объекта), поскольку вы используете callbacks.push ().
Я не уверен, что понимаю вашу проблему.Благодаря тому, как ваши классы структурированы, вы можете добиться желаемого, создав экземпляры обоих классов и вызвав addCallbackToStaticInstance () для обоих новых объектов.Например,
родовое словоЗатем, как указано выше, вы можете вызвать activateCallbacks () из любого объекта.
Если вы говорите, что хотите иметь возможность вызывать activateCallback () после создания экземпляра только одного из классов, вам действительно нужно переосмыслить свой подход.Я бы начал с перемещения addCallbackToStaticInstance () и activateCallbacks () в их собственный класс.
Другие советы
Это очень странный способ делать что-то, но ваша основная проблема в том, что ваш объект обратного вызова не является частью SomeStaticInstance, он определен в анонимном закрытии.Также ваш объект обратного вызова {}
должен быть массивом []
.
попробуйте staticInstance.callbacks = [];
вместо var callbacks = {};
и
родовое слово