zoukankan      html  css  js  c++  java
  • 发布订阅案例讲解

    //发布 订阅 [fn,fn]靠着订阅的数组函数作为桥梁,发布与订阅没有关系,订阅的时候不知道什么时候发布,发布的时候也不知道订阅的了多少函数,订阅的时候数组里放函数
    //观察者者模式是基于发布订阅的模式
    //发布的事件函数
    function EventEmitter() {
    this._arr = [];//定义一个数组用来存储回调函数的
    }
    //原型上定义发布函数将回调函数都放在该发布数组中
    EventEmitter.prototype.on = function (cb) {
    this._arr.push(cb);
    }
    //定义发布的函数,用来执行数组中的回调函数
    EventEmitter.prototype.emit = function () {
    this._arr.forEach(fn => fn())
    }
    //定义发布事件的实例,用来订阅和发布
    let e = new EventEmitter();
    //订阅
    e.on(function () {
    console.log(1);
    });
    e.on(function () {
    console.log(2)
    });
    // 发布
    e.emit();
    输出结果如下:
     
     
    以上是有两个订阅函数一个发布函数执行两个订阅函数
    如下例子是俩发布函数订阅一个发布函数,代码如下:
    function EventEmitter() {
    this._arr = [];
    }
    let fs = require('fs')
    EventEmitter.prototype.on = function (cb) {
    this._arr.push(cb);
    }

    EventEmitter.prototype.emit = function () {
    this._arr.forEach(fn => fn.apply(this, arguments))//发布函数传参
    }
    let e = new EventEmitter();
    let teacher = {}
    // 定义发布函数
    e.on(function (key, value) {
    teacher[key] = value;
    if (Object.keys(teacher).length === 2) {
    console.log(teacher);
    }
    })
    fs.readFile("./a.txt", "utf8", function (err, data) {
    if (err) return console.log(err);
    //发布 执行发布函数
    e.emit('name', data)
    });
    fs.readFile("./b.txt", "utf8", function (err, data) {
    if (err) return console.log(err);
    //发布 执行发布函数
    e.emit('age', data)
    });
    a.txt 内容是:“along”;
    b.txt 内容是:"32
     
  • 相关阅读:
    hitachi2020 C-ThREE
    LOJ#2083. 「NOI2016」优秀的拆分
    BZOJ2754: [SCOI2012]喵星球上的点名
    BZOJ4516: [Sdoi2016]生成魔咒
    AtCoder Beginner Contest 146解题报告
    拉格朗日插值复习笔记
    对于求解单峰函数最值问题的探讨
    BZOJ5509: [Tjoi2019]甲苯先生的滚榜
    面试技巧
    性能案例分析 | MAT分析内存泄露
  • 原文地址:https://www.cnblogs.com/zhx119/p/11474423.html
Copyright © 2011-2022 走看看