美文网首页
EventEmitter模块实验

EventEmitter模块实验

作者: 枫丶筱 | 来源:发表于2018-02-28 15:41 被阅读70次

阿里面试题为例

完成 EventEmitter 模块,它是一个类,它的实例具有以下几个方法:on、emit、off:

on(eventName, func):监听 eventName 事件,事件触发的时候调用 func 函数。
emit(eventName, arg1, arg2, arg3...):触发 eventName 事件,并且把参数 arg1, arg2, arg3... 传给事件处理函数。
off(eventName, func):停止监听某个事件。

    class EventEmitter {
        constructor() {
            this.handlers = {}
        }

        on(eventName, func) {
            let callbacks = eventName in this.handlers ? this.handlers[eventName] : []
            callbacks.push(func)
            this.handlers[eventName] = callbacks
        }

        emit(eventName, ...args) {
            if (!eventName in this.handlers) return
            const callbacks = this.handlers[eventName]
            callbacks.map(cb => {
                cb(...args)
            })
        }

        off(eventName, func) {
            if (!eventName in this.handlers) return
            let callbacks = this.handlers[eventName]
            let index = callbacks.indexOf(func)
            callbacks.splice(index, 1)
        }
    }

    const emitter = new EventEmitter()
    const sayHi = (name) => console.log(`Hello ${name}`)
    const sayHi2 = (name) => console.log(`Good night, ${name}`)

    emitter.on('hi', sayHi)
    emitter.on('hi', sayHi2)
    emitter.emit('hi', 'ScriptOJ')
    // => Hello ScriptOJ
    // => Good night, ScriptOJ

    emitter.off('hi', sayHi)
    emitter.emit('hi', 'ScriptOJ')
    // => Good night, ScriptOJ

    const emitter2 = new EventEmitter()
    emitter2.on('hi', (name, age) => {
        console.log(`I am ${name}, and I am ${age} years old`)
    })
    emitter2.emit('hi', 'Jerry', 12)
    // -------------------------------------------------------------------------------
    class Person extends EventEmitter {
        constructor(name) {
        super()
        this.name = name;
        this.age = 1;
        // this.on('growup', () => {
        //     console.log('ceshi' + this.name);
        // })
        // this.growup()
    }

        growup() {
            setInterval(() => {
                this.age++;
                this.emit('growup');
            }, 1000);
        }
    }

    const p1 = new Person('xiao_liu');
    const p2 = new Person('xiao_liu1');
    p1.on('growup', () => {
        console.log('长大一岁');
    })
    p2.on('growup', () => {
        console.log('长大一岁');
    })

    p1.growup()
    p2.growup()

相关文章

  • EventEmitter模块实验

    阿里面试题为例 完成 EventEmitter 模块,它是一个类,它的实例具有以下几个方法:on、emit、off...

  • nodejs的EventEmitter类

    EventEmitter 类events 模块只提供了一个对象: events.EventEmitter。Even...

  • Node.js EventEmitter

    EventEmitter 类 events 模块只提供了一个对象: events.EventEmitter。Eve...

  • EventEmitter

    events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是...

  • 02.node的events模块

    events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是...

  • JS原生实现EventEmitter事件队列

    EventEmitter 是什么 Node.js 的 events 模块对外提供了一个 EventEmitter ...

  • Javascript 事件EventEmitter使用示例

    在基于javascript的事件进行开发时,常用到event模块的EventEmitter类。要使自己的模块具有事...

  • EventEmitter

    Node的事件模块中,目前只包含一个类:EventEmitter。这个类在Node的内置模块中被大量使用,在Nod...

  • node.js events事件模块

    1、EventEmitter来自events模块。调用的时候为: 2、所有能触发事件的对象都是 EventEmit...

  • 发布订阅模式

    发布订阅模式 socket.io,发布订阅的实现 node 的 Eventemitter模块 Vue 中的 Eve...

网友评论

      本文标题:EventEmitter模块实验

      本文链接:https://www.haomeiwen.com/subject/wzxixftx.html