//发布 订阅 [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