JS 16行代码实现发布订阅

935 阅读1分钟

 

发布-订阅模式


仔细思考一下订杂志的过程,我们会发现这样几个特点:
1、 消费者订杂志不需要直接找出版社;
2、 出版社只需要把杂志交给邮局;
3、 邮局将杂志送达消费者。
邮局在整个过程中扮演了非常重要的中转作用,在出版社和消费者相互不需要知道对方的情况下,邮局完成了杂志的投递。

在 Node.js EventEmitter 中的 on 和 emit 方法

on 为订阅者

emit 为发布者

on 的方法使用为 :

on('name', function)    //订阅

emit 的使用方法为:

emit('name')

实现思路

首先 on 方法传入的两个参数,一个为标识,一个为函数

这里我们可以用一个对象来储存传进来的 name 和 函数

其次 emit 方法是 穿进一个标识,通过这个标识来找到其所对应的函数


实现代码

class Event {  
    constructor() {    
        this.listener = {};  //定义一个对象来接受传进来的值  
    }  
    on(key, fn) {    
        if (!this.listener[key]) {  //判断listener中有无传进来的 key 值      
            this.listener[key] = []  // 如果没有则创建一个 数组    
        }    
        this.listener[key].push(fn)  //将函数push到 数组中  
    }  
    emit(key) {    
        for (let i = 0; i < this.listener[key].length; i++) {  //使用循环遍历数组中的函数      
            this.listener[key][i]()  //调用数组中的函数    
        }  
    }
}

// 调用 Event
var ev = new Event()
ev.on('foo', () => { console.log('foo1') })
ev.on('foo', () => { console.log('foo2') })
ev.emit('foo')