js发布订阅模式实现

//可以用于无相关页面或组件的事件、数据传递
let events = {}
/**订阅**/
function on(name, self, callback) {
  let tuple = [self, callback]
  let callbacks = events[name]
  if (Array.isArray(callbacks)) {
    callbacks.push(tuple)
  } else {
    events[name] = [tuple]
  }
}

/**取消订阅**/
function remove(name, self) {
  let callbacks = events[name]
  if (Array.isArray(callbacks)) {
    events[name] = callbacks.filter((tuple) => {
      return tuple[0] != self
    })
  }
}

/**发布**/
function emit(name, data) {
  let callbacks = events[name]
  if (Array.isArray(callbacks)) {
    callbacks.map((tuple) => {
      let self = tuple[0]
      let callback = tuple[1]
      callback.call(self, data)
    })
  }
}
module.exports = {
  on,
  remove,
  emit
}

  

posted @ 2019-01-28 15:05  dnoyeb  阅读(446)  评论(0编辑  收藏  举报