发布-订阅者模式

206 阅读1分钟

发布 - 订阅模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。在 JavaScript开发中,我们一般用事件模型来替代传统的发布 - 订阅模式。

这是一种创建 松散耦合 代码的技术。它定义对象间 一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。

const fs = require('fs');
let obj = {};

class E{
    constructor(){
        this.releaseArr = [];   // 存放订阅者的方法
    }
    on(fn){
        this.releaseArr.push(fn);   // 把订阅者要发送的东西存入到releaseArr数组中
    }
    emit(val){
        console.log(val)
        this.releaseArr.forEach(fn=>fn());  // 事件触发依次执行 
    }
}
let e = new E();
console.log(e.releaseArr);

e.on(()=>{
    console.log("我是订阅")
});

e.on(()=>{
    if(e.releaseArr.length == 2){
        console.log(obj)
    }
})

fs.readFile('./1.txt','utf8',function(err,data){
    if(err) return;
    obj['xxx'] = data;
    e.emit("我是发布1号");  // 发射器 -- 调用依次存入到releaseArr中的事件
})
fs.readFile('./2.txt','utf8',function(err,data){
    if(err) return;
    obj['yyy'] = data;
    e.emit("我是发布2号");  // 发射器
})

理解

村里分土地

张三去大队里问什么时候分地,村长说,手机号留下,回去等消息.

李四去大队里问什么时候分地,村长说,手机号留下,回去等消息.

王五去大队里问什么时候分地,村长说,手机号留下,回去等消息.

...

村里每户都留下了手机号,(订阅了分地的消息).等村长通知.

e.on(()=>{
    console.log("分地就收到短信了")
})

村长等到(读取)了县里发通知了,时机到了,村长给每个人发短息了 (发布)

fs.readFile('某某县分地的通知.txt','utf8',(err,data)=>{
    if(err) return
    e.emit("村里分地了,大家都来吧");
})