2016-03-28 4 views
1

私は3つの異なるjavascriptファイルを持っていますが、最小のイベントはイベントを出していますが、2番目(大きいもの)のファイルはイベントをピックアップしてさらにメインファイルに送ります。 これは私がこれまでにしようとしているものです:ノードを持つファイルを実行するときに他のモジュールのノードイベントエフェクタ

//mini.js 
var EventEmitter = require('events').EventEmitter; 
var ee = new EventEmitter; 

console.log("Emitting event"); 
var message = "Hello world"; 
ee.emit('testing',message); 


//second.js 
var mini = require('./mini.js'); 
var EventEmitter = require('events').EventEmitter; 
var ee = new EventEmitter; 

mini.on('testing',function(message){ 
    console.log("Second file received a message:",message); 

    console.log("Passing further"); 
    ee.emit('testing',message); 
}); 

//main.js 
var sec = require('./second.js'); 

sec.on('testing',function(message){ 
    console.log("Main file received the message",message); 
}); 

は、しかし、私は

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

エラーが発生します。

私はここで間違っていますか? ありがとう

答えて

2

この1は動作するはずです:

をこれは内部first.jsを置くためのコンテンツです:

//first.js 
var util = require('util'), 
    EventEmitter = require('events'); 


function First() { 
    EventEmitter.call(this) 
} 
util.inherits(First, EventEmitter); 


First.prototype.sendMessage = function (msg) {  
    this.emit('message', {msg:msg}); 
}; 


module.exports = First; 

これはsecond.jsの内側に配置する内容です:

//second.js 
var First = require('./first.js'); 
var firstEvents = new First(); 

// listen for the 'message event from first.js' 
firstEvents.on('message',function(data){ 
    console.log('recieved data from first.js is : ',data); 
}); 


// to emit message from inside first.js 
firstEvents.sendMessage('first message from first.js'); 

今すぐ実行node second.jsあなたはあなたに「メッセージ」イベントを発してもらうべきです。

このパターンを使用して、モジュール間であらゆるレベルのメッセージングを実現できます。

これが役に立ちます。

+0

@NedasMikoleikaこの場合、** second.js **を** main.js **にリネームしてください。それは、それとも、ここに欠けているものがありますか? – Ismail

+0

私は実際に** main.js **ファイルに他のもの(私のサーバの残りの部分)を持っています。 – Nedas

+0

@NedasMikoleika問題はありません。** main.js **ファイルに** second.js **のコンテンツを追加するだけです。 – Ismail

1

あなたはEventEmitterインスタンスをmini.jsにエクスポートしていません。 mini.jsにこれを追加します。

module.exports = ee; 

また、あなたはmain.js.が利用できるようにするために、そのEventEmitterインスタンスをエクスポートする場合second.jsに同様の行を追加する必要があります

もう1つの問題は、second.jsがそのtestingイベントハンドラを追加する前に、mini.jsでtestingを放出しているため、そのイベントが見つからなくなることです。

+0

これについての修正はありますか? – Nedas