【问题标题】:NodeJS eventEmitter.emit: this is not the expected scopeNodeJS eventEmitter.emit:这不是预期的范围
【发布时间】:2015-02-06 14:43:41
【问题描述】:

我想按特定顺序加载我的一些对象,例如首先连接到数据库,然后启动邮件服务,然后开始加载游戏内容,最后我想启动网络服务器,以便在上线之前加载所有内容。

我做了这样的链子:

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

当我启动脚本时,数据库正常执行,发出ready,调用mail的init函数,但是当调用this.emit时它进入一个循环。

如您所见,我已经尝试找出为什么它在邮件中无休止地循环。

console.log(this.constructor);

说它是DataBase,所以它不是在Mail范围内发射,而是在DataBase范围内发射,因为this = DataBase。

为什么邮件“类”数据库中是“this”而不是 Mail? 如何解决我的问题?我创建的课程有误吗?

【问题讨论】:

    标签: node.js eventemitter


    【解决方案1】:

    当您执行db.on('ready', mail.init) 时,您将邮件初始化函数作为回调传递,但没有其上下文。你需要指定一个上下文,例如.bind:

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

    【讨论】:

    • 谢谢!解决了问题,您的解释很有帮助。
    猜你喜欢
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多