2016-01-26 3 views
3

Например, chat является EventEmitter. Функция обратного вызова может принимать параметр, называемый message. Мой вопрос: откуда берется message? Предоставляет ли это событие message? Если это так, не могли бы вы, ребята, дать мне пример события message и позволить мне посмотреть, когда он будет запущен, как был предоставлен параметр для chat EventEmitter? Спасибо, ребята, очень.Откуда возникает параметр в функции обратного вызова? Node.js

chat.on('message',function(message){ 
    console.log(message); 
}); 

ответ

1

Параметр message исходит из того, что вызвало событие.

Вы можете видеть из source из EventEmitter, что on является синонимом addListener:

EventEmitter.prototype.on = EventEmitter.prototype.addListener; 

И тогда вы можете увидеть, что addListener просто помещает обработчик в список обработчиков для указанного типа (упрощенный код):

EventEmitter.prototype.addListener = function(type, listener) { 
    // ... 
    if (!this._events) this._events = {}; 
    // ... 
    this._events[type] = this._events[type] || []; 
    this._events[type].push(listener); 
    // ... 
    return this; 
}; 

Затем emit вызовы каждый обработчик в соответствующем списке:

EventEmitter.prototype.emit = function(type) { 
    // ... 
    var args = Array.prototype.slice.call(arguments, 1); 

    var listeners = this._events[type]; 
    for (var i = 0, l = listeners.length; i < l; i++) { 
    listeners[i].apply(this, args); 
    } 
    return true; 
    // ... 

};

Так что, когда вы говорите .emit('message', "Hello"), args будет ["Hello"] и listeners[i].apply(this, args) пошлет этот список аргументов function(message) { /* ... */ }, которые вы определили в вашем .on вызова: это как message становится "Hello".

+0

Довольно ясно! Спасибо за ваш ответ! – SmartFingers