Skip to main content

观察者模式

//发布者的构造函数
function Publish() {
this.subscribers = []; //订阅者列表,每个订阅者其实是一个处理得到信息的函数
}

//发布者的发布方法
Publish.prototype.next = function (news) {
this.subscribers.forEach(fn => fn(news)) //将信息发布给每个订阅者,fn代表订阅者
return this //链式编程
}

//观察者的订阅方法
Publish.prototype.subscribe = function (callback) {
let alreadyIn = this.subscribers.some(sub => sub == this)
if (!alreadyIn) {
this.subscribers.push(callback)
}
return this
}

//取消订阅
Publish.prototype.unsubscribe = function () {
// this.subscribers.filter(subscriber=>subscriber!==this);
this.subscribers = [];
return this
}
// //观察者的订阅方法
// Function.prototype.subscribe = function(publisher){
// let alreadyIn = publisher.subscribers.some( subscriber => subscriber == this)
// if(!alreadyIn){
// publisher.subscribers.push(this)
// }
// return this
// }

// //取消订阅
// Function.prototype.unsubscribe = function(publisher){
// publisher.subscribers.filter(subscriber=>subscriber!==this)
// return this
// }
<script>
function fn() {
const demo = new Publish();
setInterval(() => {
demo.next(Math.random());
}, 1000);
return demo;
}
const result = fn().subscribe(a => {
console.log('--------', a);
});

function cancel() {
result.unsubscribe()
}
</script>