发布订阅
是异步编程的方案之一。
优点:松耦合,灵活
缺点:无法确保消息被触发,以及触发多少次。
普通JavaScript的发布订阅
function PubSub() {
this.events = {};
this.publish = function (eventName, ...data) {
if(this.events[eventName]) {
this.events[eventName].forEach(callback => {
callback.apply(this, data);
});
}
}
this.subscribe = function(eventName, callback) {
if(this.events[eventName]) {
this.events[eventName].push(callback);
} else {
this.events[eventName] = [callback];
}
}
this.unSubscribe = function(eventName, callback) {
if(this.events[eventName]) {
this.events[eventName] = this.events[eventName].filter((item)=>{
return item.name != callback.name;
});
}
}
}
测试:
var test = new PubSub();
test.subscribe("test1", function(){
console.log("subscribe1");
});
test.subscribe("test1", function(){
console.log("subscribe2");
});
test.subscribe("test2", function(){
console.log("subscribe3");
})
test.subscribe("test2", function(){
console.log("subscribe4");
});
test.publish("test1"); // 输出subscribe1 subscribe2
test.unSubscribe("test1", scrFun1);
test.publish("test1"); // 输出subscribe2
NodeJs的发布订阅
EventEmitter:是事件触发与事件监听功能的封装。
通过events.EventEmitter实现发布订阅。可以通过继承使用EventEmitter的方法。
events.EventEmitter方法:
- emit
- on
- once
- addListener
- removeListener
使用
const{ EventEmitter } = require("events");
function watcher() {
EventEmitter.call(this); // 继承
this.handle.onChange = function() {
this.emit("", function(){});//通过上一行代码实现继承,才能在这个地方使用emit方法。
}
}