zhouzhongyuan / qa

Questions recods
MIT License
5 stars 1 forks source link

为什么Yigo2.0的App要使用EventEmitter? #21

Closed zhouzhongyuan closed 7 years ago

zhouzhongyuan commented 7 years ago

EventEmitter是什么?

Event模块(events.EventEmitter)是一个简单的事件监听器模式的实现。

什么是“事件监听器模式”?

一个非常简单的事件监听器模式的实现

var EventEmitter = function () {
    this.events = {};  //事件回调存储的位置
};

//当你写了App.on('NO_ROUTE',() =>{...}),回调函数会被push到this.events.NO_ROUTE的数组中去
EventEmitter.prototype.on = function (event, listener) {
    if (typeof this.events[event] !== 'object') {
        this.events[event] = [];
    }

    this.events[event].push(listener);
};

//当你写了APP.emit('NO_ROUTE'), 会执行this.events.NO_ROUTE数组中的函数
EventEmitter.prototype.emit = function (event) {
    var i, listeners, length, args = [].slice.call(arguments, 1);

    if (typeof this.events[event] === 'object') {
        listeners = this.events[event].slice();
        length = listeners.length;

        for (i = 0; i < length; i++) {
            listeners[i].apply(this, args);
        }
    }
};