Skip to content

发布订阅模式

手写 mitt

js
export default function mitt(all) {
  all = all || new Map();
  return {
    all,
    // 订阅事件
    on(type, handler) {
      const handlers = all.get(type);
      if (handlers) {
        handlers.push(handler);
      } else {
        all.set(type, [handler]);
      }
    },
    // 取消订阅事件
    off(type, handler) {
      const handlers = all.get(type);
      if (handlers) {
        if (handler) {
          if (handlers.indexOf(handler) > -1) {
            handlers.splice(handlers.indexOf(handler), 1);
          }
        } else {
          all.set(type, []);
        }
      }
    },
    // 发布事件
    emit(type, evt) {
      const handlers = all.get(type);
      if (handlers) {
        handlers.forEach((handler) => {
          handler(evt);
        });
      }
    },
  };
}