Skip to content

JavaScript 中的发布订阅模式

这里要提出的是,我们一直讨论的发布—订阅模式,跟一些别的语言(比如 Java)中的实现 还是有区别的。在 Java 中实现一个自己的发布—订阅模式,通常会把订阅者对象自身当成引用传 入发布者对象中,同时订阅者对象还需提供一个名为诸如 update 的方法,供发布者对象在适合的 时候调用。而在 JavaScript 中,我们用注册回调函数的形式来代替传统的发布—订阅模式,显得更 加优雅和简单。

另外,在 JavaScript 中,我们无需去选择使用推模型还是拉模型。推模型是指在事件发生时, 发布者一次性把所有更改的状态和数据都推送给订阅者。拉模型不同的地方是,发布者仅仅通知 订阅者事件已经发生了,此外发布者要提供一些公开的接口供订阅者来主动拉取数据。拉模型的 好处是可以让订阅者“按需获取”,但同时有可能让发布者变成一个“门户大开”的对象,同时 增加了代码量和复杂度。

刚好在 JavaScript 中,arguments 可以很方便地表示参数列表,所以我们一般都会选择推模型, 使用 Function.prototype.apply 方法把所有参数都推送给订阅者。