NodeJS eventEmitter.emit:这不是预期的范围

我想按照特定的顺序加载一些对象,比如先连接数据库,然后启动邮件服务,然后开始加载游戏的东西,最后我想启动networking服务器,所以在上线之前加载所有东西。

我做了这样一个链:

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(); 

Mail类看起来像这样:

 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时,它会到达一个循环。

正如你所看到的,我已经试图找出为什么它无休止的循环周围的邮件。 该

 console.log(this.constructor); 

说是DataBase,所以不是在Mail范围内发射,而是在DataBase范围内放射,因为这是DataBase。

为什么在邮件“类”数据库中的“这个”,而不是邮件? 我该如何解决我的问题? 我创build类错了吗?

当你做db.on('ready', mail.init)你传递的是mail init函数作为callback函数,但没有它的上下文。 您需要指定一个上下文,例如.bind

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