在JavaScript中,观察者模式经常被使用。其中有一个棘手的问题是主题(subject)对观察者(observers)的引用。它们需要清理。对于常规应用程序,我使用以下经验法则:
- 如果主题的生命周期短于(或等于)观察者,则可以直接执行
subject.on('event', ...)
- 如果主题的生命周期长于观察者,则需要使用
observer.listenTo(subject, 'event', ...)
在第二种情况下,listenTo
了解观察者的生命周期,并且它会在观察者结束时自动删除侦听器。
在现代SPA(单页应用程序)样式中,任何时候只有应用程序的某些部分处于活动状态,这变得非常重要。如果将其与Web套接字配合使用,这是事件流的完美候选者,而且很可能具有长生命周期,那么这就更加重要了。
使用FRP时,例如代表随时间变化的值的事件流,我(不知道)创建了许多侦听器。每个filter
、map
和flatMap
都会创建一个新流,该流可能使用侦听器与上一个流相连接。
在我的脑海中,确定何时以及如何删除这些侦听器似乎非常棘手。我想象不到自己是第一个思考这个问题的人,但我在互联网上找不到太多相关信息。
我看到其他语言的一些框架使用弱引用(weak references)。JavaScript没有弱引用(WeakMap在此处无法使用)的概念。即使有了它,似乎也不是一个好主意,因为垃圾回收的时间不清楚。
- 当前框架是如何解决这个问题的?
- 框架是否与对象的生命周期联系在一起?如果是:如何实现?