node中发布订阅(模式)

vue express也是借鉴node中的发布订阅

function EventEmitter(params) {
    this._events = {}
}

//订阅
EventEmitter.prototype.on = function (eventName, callback) {
    if (!this._events) {
        this._events = {}
    }
    if (this._events[eventName]) {
        this._events[eventName].push(callback);
    } else {
        this._events[eventName] = [callback];
    }
}

//发布
EventEmitter.prototype.emit = function (eventName, ...arg) {
    this._events[eventName].forEach(fn => {
        fn(...arg);
    });
}

//解绑事件
EventEmitter.prototype.off = function (eventName, callback) {
    if (this._events && this._events[eventName]) {
        this._events[eventName].filter(fn => {
            return (fn[eventName] !== callback && fn.l == callback)
        });
    }
}

// 只触发一次
EventEmitter.prototype.once = (eventName, callback) => {
    let one = this.on(eventName, () => {//绑定执行完毕后移除
        callback();
        one.l = callback;
        this.off(eventName, one)
    })
    this.on(eventName, on);
}

module.exports = EventEmitter;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容