• 技术文章 >Web开发 >JavaScript

    js发布订阅模式有什么用

    小妮浅浅小妮浅浅2021-10-09 10:41:32原创159

    1、发布订阅模式可以广泛应用于异步编程,这是一种取代回调函数的方案。

    2、发布订阅模式可以取代对象之间硬编码的通知机制,一个对象不再需要明确调用另一个对象的接口。

    实例

    // 由于这些成员对于任何发布者对象都是通用的,故将它们作为独立对象的一个部分来实现是很有意义的。那样我们可将其复制到任何对象中,并将任意给定对象变成一个发布者。
    // 如下实现一个通用发布者,定义发布者对象……
    let publisher = {
      subscribers: {
        any: []
      },
      subscribe: function (fn, type = `any`) {
        if (typeof this.subscribers[type] === `undefined`) {
          this.subscribers[type] = [];
        }
        this.subscribers[type].push(fn);
      },
      unSubscribe: function (fn, type = `any`) {
        let newSubscribers = [];
        this.subscribers[type].forEach((item, i) => {
          if (item !== fn) {
            newSubscribers.push(fn);
          }
        });
        this.subscribers[type] = newSubscribers;
      },
      publish: function (args, type = `any`) {
        this.subscribers[type].forEach((item, i) => {
          item(args);
        });
      }
    };
     
    // 定义一个函数makePublisher(),它接受一个对象作为参数,通过把上述通用发布者的方法复制到该对象中,从而将其转换为一个发布者
    function makePublisher(obj) {
      for (let i in publisher) {
        if (publisher.hasOwnProperty(i) && typeof publisher[i] === `function`) {
          obj[i] = publisher[i];
        }
      }
      obj.subscribers = { any: [] };
    }
     
    // 实现paper对象
    var paper = {
      daily: function () {
        this.publish(`big news today!`);
      },
      monthly: function () {
        this.publish(`interesting analysis`, `monthly`);
      }
    };
     
    // 将paper构造成一个发布者
    makePublisher(paper);
     
    // 看看订阅对象joe,该对象有两个方法:
    var joe = {
      drinkCoffee: function (paper) {
        console.log(`Just read ` + paper);
      },
      sundayPreNap: function (monthly) {
        console.log(`About to fall asleep reading this ` + monthly);
      }
    };
     
    // paper注册joe(即joe向paper订阅)
    paper.subscribe(joe.drinkCoffee);
    paper.subscribe(joe.sundayPreNap, `monthly`);
     
    // 即joe为默认“any”事件提供了一个可被调用的方法,而另一个可被调用的方法则用于当“monthly”类型的事件发生时的情况。现在让我们来触发一些事件:
    paper.daily();      // Just read big news today
    paper.daily();      // Just read big news today
    paper.monthly();    // About to fall asleep reading this interesting analysis
    paper.monthly();    // About to fall asleep reading this interesting analysis
    paper.monthly();    // About to fall asleep reading this interesting analysis

    以上就是js发布订阅模式的作用,希望对大家有所帮助。更多js学习指路:js教程

    专题推荐:js 发布订阅模式
    品易云
    上一篇:js原型链的优缺点 下一篇:js自定义事件的实现

    相关文章推荐

    • js变量作用域是什么• js作用域链中的对象访问顺序• js链表结构如何实现• js中如何查找链表元素• js中insert如何插入节点• js中removeat删除节点的方法• js原型链继承的关系• js原型链默认的原型• js子类型重写的注意点• js引用类型值的缺点• js原型不能传参的探究• js使用构造函数的缺点• js组合继承的优缺点• js中Object.create方法是什么• js原型链的优缺点

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网