发布订阅和观察者模式

131 阅读1分钟

参考B站视频:www.bilibili.com/video/BV1o4…

1、发布订阅

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <button id="btn" onclick="send">点我发布</button>
  </body>
</html>
<script>
  function Events() {
    this.callbacks = [];
    this.results = [];
  }
  Events.prototype.on = function(callback) {
    this.callbacks.push(callback);
  }; //订阅
  Events.prototype.emit = function(data) {
    this.results.push(data);
    this.callbacks.forEach((i) => i(this.results));
  }; //发布
  let e = new Events();
  e.on(function(data) {
    console.log(data);
  });
  console.log(e);
  let btn = document.getElementById("btn");
  btn.onclick = function() {
    e.emit("郭丹丹");
  };
</script>

(1)订阅的时候,是先定好我需要做什么,传进去一个回调函数,然后这个订阅的函数会将我们传入的这个回调函数,放在一个数组里面,这个数组存放着我们的所有的订阅的事件;

(2)发布:当我们发布的时候我们需要传入我们要发布的消息,这个消息也是要被存放到一个结果的数组里面,因为可能是发布多个,然后当我们发布的时候,我们需要将所有订阅的事件都执行,然后向他们传入所有的我们的数据;