NodeJS eventEmitter.emit: 这不是预期的范围
NodeJS eventEmitter.emit: this is not the expected scope
我想按特定顺序加载我的一些对象,比如首先连接到数据库,然后启动邮件服务,然后开始加载游戏内容,最后我想启动网络服务器以便在上线之前加载所有内容.
我做了这样一个链:
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();
邮件 class 看起来像这样:
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);
说它是数据库,所以它不是在邮件范围内发出,而是在数据库范围内发出,因为 this = DataBase。
为什么 "this" 在邮件 "class" 数据库中而不是邮件?
我该如何解决我的问题?我创建的 class 错了吗?
当您执行 db.on('ready', mail.init)
时,您将邮件初始化函数作为回调传递,但没有其上下文。您需要指定上下文,例如 .bind
:
db.on('ready', mail.init.bind(mail))
我想按特定顺序加载我的一些对象,比如首先连接到数据库,然后启动邮件服务,然后开始加载游戏内容,最后我想启动网络服务器以便在上线之前加载所有内容.
我做了这样一个链:
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();
邮件 class 看起来像这样:
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);
说它是数据库,所以它不是在邮件范围内发出,而是在数据库范围内发出,因为 this = DataBase。
为什么 "this" 在邮件 "class" 数据库中而不是邮件? 我该如何解决我的问题?我创建的 class 错了吗?
当您执行 db.on('ready', mail.init)
时,您将邮件初始化函数作为回调传递,但没有其上下文。您需要指定上下文,例如 .bind
:
db.on('ready', mail.init.bind(mail))