首页 > Web开发 > 详细

js 最简单的发布订阅模式

时间:2020-04-04 20:22:15      阅读:135      评论:0      收藏:0      [点我收藏+]
let _subscriber: any;

function autorun(subscriber: Function) {
  _subscriber = subscriber;
  _subscriber();
  _subscriber = null;
}

class Observer {
  #list: Function[] = []; // 订阅者

  private get _last() {
    if (!this.#list.length) return null;
    return this.#list[this.#list.length - 1];
  }
  // 添加订阅者
  add() {
    if (this._last !== _subscriber) {
      this.#list.push(_subscriber);
    }
  }

  // 发布时,把订阅者挨着挨着call
  publish() {
    this.#list.forEach((it: any) => it());
  }
}

function observable(data: any) {
  const o: Map<string, Observer> = new Map();
  for (const key in data) {
    o.set(key, new Observer());
  }

  const proxy = new Proxy(data, {
    get(target: any, key: any) {
      if (_subscriber) o.get(key)!.add();
      return target[key];
    },
    set(target: any, key: any, value: any, receiver: any) {
      if (value === target[key]) return false;
      target[key] = value;
      o.get(key)!.publish();
      return true;
    },
  });
  return proxy;
}

const obj = observable({ name: "ajanuw", data: "..." });

autorun(() => {
  console.log(obj.name);
  console.log("hello " + obj.name + obj.data);
});

setTimeout(() => {
  obj.name = "suou";
}, 1000);

setTimeout(() => {
  obj.data = "......";
}, 2000);

执行后:

λ ts-node index.ts
ajanuw
hello ajanuw...
suou
hello suou...
suou
hello suou......

js 最简单的发布订阅模式

原文:https://www.cnblogs.com/ajanuw/p/12633112.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!