在 JavaScript 中,观察者模式经常被使用。它有一个棘手的问题,那就是主题保留观察者的参考。他们需要清理。对于常规应用程序,我使用以下经验法则:
- 如果对象的寿命短于(或等于)观察者,我可以这样做
subject.on('event', ...)
- 如果主题的寿命比观察者长,我需要使用
observer.listenTo(subject, 'event', ...)
在第二种情况下,listenTo
它知道观察者的生命周期,它会在观察者死亡时自动移除监听者。
在现代 SPA(单页应用程序)风格中,在任何时候只有部分应用程序处于活动状态,这变得非常重要。如果你将它与 Web 套接字结合起来,它是事件流的完美候选者,并且很可能长期存在,这变得更加重要。
使用 FRP,具有表示随时间变化的值的事件流之类的东西,我(不知道)创建了很多侦听器。每个filter
,map
并flatMap
创建一个新的流,该流与前一个流绑定(可能使用侦听器)。
在我看来,确定如何以及何时需要删除这些侦听器似乎非常棘手。我无法想象我是第一个考虑这个问题的人,但我在互联网上找不到太多关于这个问题的信息。
我见过一些其他语言的框架使用弱引用。JavaScript 没有弱引用的概念(WeakMap 在这里不可用)。即使有,这似乎也是一个坏主意,因为不清楚何时进行垃圾收集。
- 这在当前框架中是如何解决的?
- 框架是否与对象的生命周期相关联?如果是:如何?