1、发布订阅模式
订阅一件事,当事件发生的时候,触发对应的函数
订阅on,发布emit,promise的内部也是基于发布订阅模式的
let e = {
_obj: {},
_callbacks: [],
on(callback){
this._callbacks.push(callback); //将订阅的函数一次放入数组中
},
emit(key, value){
this._obj[key] = value
this._callbacks.forEach( m => { //依次执行订阅的函数
m(this._obj)
} )
}
}
e.on(function(obj){ //每次发布都会触发这个函数
console.log(obj)
})
fs.readFile("./jiagouke/1.callback/name.txt", "utf8", function (error, data) { e.emit('age', data)})fs.readFile("./jiagouke/1.callback/age.txt", "utf8", function (error, data) { e.emit('name', data)})
2、观察者模式
观察者模式基于发布订阅模式
区别:
1)发布订阅:发布和订阅无关
2)观察者模式: 观察者和被观察者是相关的;被观察者存放着观察者,被观察者状态变化,更新自己身上的所有观察者
class Subject{
constructor(){
this.state = 'happy';
this.arr = []; //用来存放观察者
}
attach(member){ // 装载观察者的
this.arr.push(member)
}
updateState(newState){ // 更新自己的状态
this.state = newState;
this.arr.forEach( observer => observer.update(newState))
}
}
class Observer{
constructor(who){
this.who = who;
}
// 这个方法是用来被 被观察者调用的
update(newState){
console.log(this.who+newState+'了')
}
}
let subject = new Subject();
let my1 = new Observer('mom');
let my2 = new Observer('daddy');subject.attach(my1);
subject.attach(my2);subject.updateState('carry');