发布/订阅

96 阅读1分钟

发布订阅

是异步编程的方案之一。

优点:松耦合,灵活

缺点:无法确保消息被触发,以及触发多少次。

普通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方法。
    }
}