Расширение EventEmitter узла в ES5 - PullRequest
0 голосов
/ 13 февраля 2020

Я изучаю JavaScript / Nodejs, и я решил начать с ES5, прежде чем смотреть на ES6. Я смотрю на прототип наследования и EventEmitter.

Я хочу расширить EventEmitter чем-то простым, мой пример кода ниже. Однако я получаю сообщение об ошибке:

this.emit ('messageRead', message);

TypeError: this.emit не является функцией

Что я делаю не так?

var EventEmitter = require('events').EventEmitter;

var MyEmitter = function() {
    EventEmitter.call(this);
    this.messages = []
}

MyEmitter.prototype = Object.create(EventEmitter.prototype);
MyEmitter.prototype.constructor = MyEmitter;
MyEmitter.prototype.addMessage = function(message) {
    this.messages.push(message)
    this.emit('messageAdded', message);
    return this;
}
MyEmitter.prototype.readMessages = function() {
    this.messages.forEach(function(message){
        this.emit('messageRead', message);
    });
    return this;
}

var emitter1 = new MyEmitter();
emitter1
    .addMessage('hello')
    .addMessage('goodbye')
    .on('messageAdded', function(message) { console.log('message added: ' + message)})
    .on('messageRead', function(message) { console.log('message read: ' + message)})
    .readMessages();

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Проблема с моим кодом была с этим и замыканиями. См. Обновленные сообщения readMessages ниже.

Но благодаря @Yarsolav, который, вероятно, указал на лучшее решение.

var EventEmitter = require('events').EventEmitter;

var MyEmitter = function() {
    EventEmitter.call(this);
    this.messages = []
}

MyEmitter.prototype = Object.create(EventEmitter.prototype);
MyEmitter.prototype.constructor = MyEmitter;
MyEmitter.prototype.addMessage = function(message) {
    this.messages.push(message)
    this.emit('messageAdded', message);
    return this;
}
MyEmitter.prototype.readMessages = function() {
    var that = this;
    this.messages.forEach(function(message){
        that.emit('messageRead', message);
    });
    return this;
}

var emitter1 = new MyEmitter();
emitter1
    .on('messageAdded', function(message) { console.log('message added: ' + message)})
    .on('messageRead', function(message) { console.log('message read: ' + message)})
    .addMessage('hello')
    .addMessage('goodbye')
    .readMessages();
0 голосов
/ 13 февраля 2020

Вы должны наследовать от EventEmitter, а не только запускать конструктор в области действия экземпляра MyEmitter

const util = require('util');
...
util.inherits(MyEmitter, EventEmitter);
...