首页 JavaScript发布订阅事件
文章
取消

JavaScript发布订阅事件

发布订阅模式

  • 发布订阅模式(Pub/Sub)是一种事件驱动通信模式,它允许一个组件发布事件,而其他组件可以订阅这些事件。发布订阅模式在许多应用程序中都很有用,例如在需要在多个组件之间共享数据的情况下,自定义事件监听场景等。

ES5-发布订阅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function PubSub() {
  this.eventListeners = {};
}

PubSub.prototype.on = function (event, handler) {
  if (typeof handler !== "function") {
    throw new Error("Event handler should be a function");
  }
  if (this.eventListeners[event]) {
    this.eventListeners[event].push(handler);
  } else {
    this.eventListeners[event] = [handler];
  }
};

PubSub.prototype.off = function (event, handler) {
  if (typeof handler !== "function") {
    throw new Error("Event handler should be a function");
  }
  if (!this.eventListeners[event]) {
    return;
  }
  this.eventListeners[event] = this.eventListeners[event].filter(function (
    registeredHandler
  ) {
    return registeredHandler !== handler;
  });
};

PubSub.prototype.emit = function (event, ...args) {
  const handlers = this.eventListeners[event];
  if (!handlers) {
    return;
  }
  for (let handler of handlers) {
    handler.apply(this, args);
  }
};

// 直接使用
const Restaurant = new PubSub()
const handler = function () {
  console.log('chips handler called')
}
Restaurant.on('chips', handler)
Restaurant.emit('chips', handler)
// 输出 `chips handler called`

ES6-发布订阅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class PubSub {
    constructor() {
        this.eventListeners = {};
    }

  on(event, handler) {
    if (typeof handler !== "function") {
      throw new Error("Event handler should be a function");
    }

    if (this.eventListeners[event]) {
      this.eventListeners[event].push(handler);
    } else {
      this.eventListeners[event] = [handler];
    }
  }

  off(event, handler) {
    if (typeof handler !== "function") {
      throw new Error("Event handler should be a function");
    }

    if (!this.eventListeners[event]) {
      return;
    }

    this.eventListeners[event] = this.eventListeners[event].filter(
      (registeredHandler) => registeredHandler !== handler
    );
  }

  emit(event, ...args) {
    const handlers = this.eventListeners[event];

    if (!handlers) {
      return;
    }

    for (const handler of handlers) {
      handler.apply(this, args);
    }
  }
}

TS - 发布订阅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class PubSub {
  private eventListeners: { [event: string]: Function[] } = {};

  on(event: string, handler: Function): void {
    if (typeof handler !== "function") {
      throw new Error("Event handler should be a function");
    }

    if (this.eventListeners[event]) {
      this.eventListeners[event].push(handler);
    } else {
      this.eventListeners[event] = [handler];
    }
  }

  off(event: string, handler: Function): void {
    if (typeof handler !== "function") {
      throw new Error("Event handler should be a function");
    }

    if (!this.eventListeners[event]) {
      return;
    }

    this.eventListeners[event] = this.eventListeners[event].filter(
      (registeredHandler) => registeredHandler !== handler
    );
  }

  emit(event: string, ...args: any[]): void {
    const handlers = this.eventListeners[event];

    if (!handlers) {
      return;
    }

    for (const handler of handlers) {
      handler.apply(this, args);
    }
  }
}
转摘分享请注明出处

JavaScript常见算法题

了解WebAssembly