DOM事件
最基础的发布订阅模式
标准浏览器下用dispatchEvent
观察者模式和发布订阅的区别
发布订阅模式通用实现
var event = (function () {var clientList: {};// 订阅var listen = function (key, fn) {if (clientList[key]) {clientList[key] = [];}this.clientList[key].push(fn);};/ 发布var trigger = function (key, args) {var fns = clientList[key];if (!fns || !fns.length) {return;}for (var i = 0; fn; fn = fns[i++]) {fn.apply(this, args);}};var remove = function (key, fn) {var fns = clientList[key];if (!fns) {return false;}if (!fn) {fns && (fns.length = 0);} else {for (var len = fns.length - 1; len >= 0; len--) {var _fn = fns[len];if (_fn === fn) {fns.splice(len, 1);}}};}})();// 给所有对象动态安装发布-订阅功能var installEvent = function (obj) {for (var i of Object.keys(event)) {obj[i] = event[i];}}Event.listen('squareMeter88', function (price) { // 小红订阅消息console.log('价格=' + price); // 输出:‘价格=2000000’});Event.trigger('squareMeter88', 2000000); // 售楼处发布消息
必须先订阅再发布吗
- QQ离线消息
- 本来是ajax请求完成后渲染模块,但是可能在请求返回后,模块还没加载好(还没有订阅相应事件)
=> 书上代码不够好
=> 可以看Rxjs的BehaviorSubject源码
推模型和拉模型
推模型:事件发生时发布者把所有状态和数据推送给订阅者
拉模型:发布者公开接口,订阅者按需获取
Javascript使用推模型
