2015-11-28 4 views
0

У меня небольшая проблема, играющая с модульными шаблонами. Я пытаюсь прикрепить EventEmitter к моей библиотеке, но это, кажется, не работает, и я получаю:Проблема с наследованием EventEmitter

cmd.on('message',function(msg){ 
    ^
TypeError: undefined is not a function 

Моего Lib выглядит так:

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

var TestLib = function() { 
    var self = this; 

    function sendRandom(cb){ 
     self.emit('message','whatever'); 
     cb(null,0); 
    } 

    return { 
     init: function(cb) { 
      console.log('init'); 
      cb(null); 
     }, 

     run: function(params,cb){ 
      console.log('running ',params); 
      sendRandom(function(err,res){ 
       if(err){ 
        cb(new Error(err)); 
       }else{ 
        cb(null,res); 
       } 
      }); 
     }, 

     close: function(cb) {} 
    }; 
}; 

util.inherits(TestLib, EventEmitter); 
module.exports = TestLib; 

И я называю это так:

var cmd = require(__dirname+'/bin/testlib.js')(); 
cmd.on('message',function(msg){ 
    log(msg); 
}); 
cmd.init(function(err){ 
    if(err){ 
     log(err); 
    }else{ 
     cmd.run(line,function(err,res){ 
      if(err){ 
       log(err); 
      }else{ 
       log(res); 
      } 
     }); 
    } 
}); 

Я уверен, что я пропускаю что-то простое, но что?

+0

Добавить 'EventEmitter.call (это)' в конструкторе 'TestLib'. – skypjack

+0

'' '' var TestLib = function() {\t EventEmitter.call (this); '' '' ничего не меняет – xShirase

+0

О, да, я только что видел, что вы фактически возвращаете другой объект из конструктора , – skypjack

ответ

0

Посмотрите, подходит ли приведенный ниже пример.

testLib.js

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

function TestLib(ms) { 
    var self = this; 
    EventEmitter.call(this); 

    this.random = function() { 
    //emitting 'random' event randomly 
    var ms = Math.random() * 100000 % 3000; 
    console.log('emitting random event in ' + ms + ' milliseconds'); 
    setTimeout(function() { 
     self.emit('random', ms); 
     self.random(); 
    }, ms); 
    return self; 
    } 
} 

util.inherits(TestLib, EventEmitter); 
module.exports = TestLib; 

test.js

var TestLib = require('./testLib'); 

new TestLib() 
    .random() 
    .on('random', function(ms) { 
    console.log('random event emitted after ' + ms + ' milliseconds'); 
    }); 

, чтобы запустить его, выполнить node test.js

+0

К сожалению нет, мой вопрос заключается не в том, как наследовать эмитент событий, я знаю, как это сделать, но речь идет о том, как добавить событие-эмиттер к этому конкретному шаблону! Спасибо, в любом случае! – xShirase