ts案例-观察者(事件执行的流程)
var target: EmitterTarget = new EmitterTarget();
target.addEventListener("click", clickHandler1)
target.addEventListener("click", clickHandler2)
target.addEventListener("keydown", keyHandler1)
target.addEventListener("keydown", keyHandler2)
var evt: Emitter = new Emitter("click")
target.dispatchEvent(evt);
var evt1: Emitter = new Emitter("keydown");
target.dispatchEvent(evt1)
function clickHandler1(this: void, e: Emitter): void {
console.log(e)
}
function clickHandler2(this: void, e: Emitter): void {
console.log(e)
}
function keyHandler1(this: void, e: Emitter): void {
console.log(e)
}
function keyHandler2(this: void, e: Emitter): void {
console.log(e)
}
export default class Emitter {
public constructor(public readonly type: string) {
}
}
import Emitter from "./Emitter.js";
interface IHandler {
(e: Emitter): void;
}
interface IHandlerList {
[key: string]: Set<IHandler>
}
export default class EmitterTarget {
private list: IHandlerList = {};
constructor() {
}
public addEventListener(type: string, callback: IHandler): void {
if (!this.list[type]) this.list[type] = new Set();
this.list[type].add(callback);
}
public removeEventLister(type: string, callback: IHandler): void {
if (!this.list[type]) return;
if (this.list[type].has(callback))
this.list[type].delete(callback);
}
public dispatchEvent(evt: Emitter): void {
this.list[evt.type].forEach(fn => {
fn.call(this, evt);
})
}
}