2015-02-06 1 views
2

먼저 데이터베이스에 연결 한 다음 메일 서비스를 시작한 다음 특정 항목을로드하려고합니다. 그러면 게임로드 작업이 시작되고 마침내 시작하고 싶습니다. 웹 서버가 온라인 상태가되기 전에 모든 것이로드됩니다.NodeJS eventEmitter.emit : 예상 범위가 아닙니다.

db.on('ready', mail.init); 
mail.on('ready', game.init); 
game.on('ready', ws.start); 
db.init(); 

DB 모듈은 다음과 같습니다 :

는이 같은 체인을 만들어

메일 클래스는 다음과 같습니다
var config = namespace('config'), 
    mongoose = require('mongoose'), 
    events = require('events'), 
    util = require('util'); 


function DataBase() { 
    events.EventEmitter.call(this); 

    this.init = function() { 
    self = this; 

    mongoose.connect('mongodb://'+config.db.host+':'+config.db.port+'/'+config.db.database); 
    mongoose.connection.on('error', console.error.bind(console, '[Database] ERROR:')); 
    mongoose.connection.once('open', function() { 
     console.log('[database] ready') 
     self.emit('ready', {caller: 'database'}); 
    }); 
    } 
} 

util.inherits(DataBase, events.EventEmitter); 

module.exports = exports = new DataBase(); 

:

var Mail = function() { 
    events.call(this); 

    this.send = function(mailinfo) { 
    var mailData = { 
     from: config.mail.from, 
     to: to, 
     subject: subject, 
     text: templates[template] 
    }; 



    transporter.sendMail(mailData, function(err, info) { 
     if (err) 
     console.log(err); 
     else 
     console.log('Message sent: ' + info.response); 
    }); 
    } 

    this.init = function(data) { 
    console.log(this.constructor); 
    this.emit('ready', {caller: 'mail'}); 
    } 
} 

util.inherits(Mail, events); 

내가 스크립트를 시작합니다 , 데이터베이스가 제대로 실행되고, 준비가 시작되고, 메일의 초기화 함수가 호출되지만, this.emit이 c 일 때 루프가 발생합니다 alled.

여러분도 알다시피, 나는 이미 메일 주위를 끊임없이 반복하는 이유를 알아 보려고합니다.

console.log(this.constructor); 

는 데이터베이스, 그래서이 데이터베이스를 = 때문에 대신 메일 범위에 방출, 그것은 여전히 ​​데이터베이스 범위에 emitts 말한다.

메일 "클래스"데이터베이스에서 "this"가 아닌 이유는 무엇입니까? 문제를 어떻게 해결할 수 있습니까? 수업을 잘못 만들었나요?

답변

2

db.on('ready', mail.init)을 수행하면 mail init 함수를 콜백으로 전달하지만 컨텍스트는 전달하지 않습니다. 문맥을 지정해야합니다 (예 : .bind).

db.on('ready', mail.init.bind(mail)) 
+0

감사합니다. 문제를 해결하면 설명이 훨씬 도움이됩니다. – Soma