事件订阅模式的本质: 就是一个公共的 js 对象,一个事件队列的数组。发布事件就是遍历事件队列,通过发布事件的参数,获得那个方法要执行。监听就是往事件队列里 push。
var Events = function () { var obj = {} var that = this // 监听 var listen = function (key, eventfn) { var stack, _ref stack = (_ref = obj[key]) != null ? _ref : obj[ key ] = [] return stack.push(eventfn) } var one = function (key, eventfn) { remove(key) return listen(key, eventfn) } var remove = function (key) { var _ref return (_ref = obj[key]) != null ? _ref.length = 0 : void 0 } // 发布事件的方法 var trigger = function () { var fn, stack, _i, _len, _ref, key key = Array.prototype.shift.call(arguments) stack = (_ref = obj[ key ]) != null ? _ref : obj[ key ] = [] // 遍历,通过参数找到要执行的方法 for (_i = 0, _len = stack.length; _i < _len; _i++) { fn = stack[ _i ] if (fn.apply(that, arguments) === false) { return false } } } return { listen: listen, one: one, remove: remove, trigger: trigger } } export default Events
发布订阅的代码如下:
// 发布 const EventsCenter = Events() EventsCenter .trigger(‘closeTab‘, {name: name}) // 订阅 EventsCenter.listen(‘closeTab‘, function (data) { console.log(data, ‘关闭菜单‘) })