事件没有被释放或者没有被捕获的nodejs

时间:2017-09-20 12:09:51

标签: javascript node.js express events eventemitter

我不知道我的代码有什么问题。

// emitter.js
var EventEmitter = require('events').EventEmitter;
var util = require('util');
function Loadfun(param1, param2, db){
    function __error(error, row){
        if(error){
           this.emit('error', error);
           return true;
        }
        if(row.length < 1)
           this.emit('failure');
    }
    function doSomething(){
        db.query('select something', callback);
    }
    function callback(err, result){
        if(__error(error))
            return false;
        else
            this.emit('success', result);
    }
    this.doSomething = doSomething;
};
util.inherits(Loadfun,EventEmitter);
module.exports = Loadfun;

这是发射器功能。 我正在使用它来进行一些同步数据库的工作。 以下是调用函数。

var emitter = require('emitter');
router('/fetch', function(req, res){
   var fetch = new emitter(param1, param2, db);
   fetch.on('failure', function(){
       console.log('error');
   });
   fetch.on('success', function(data){
       console.log(JSON.stringify(data));
   });
   fetch.doSomething();
});

这完全正常,没有任何错误。 我尝试记录流程直到发出成功 但是没有记录事件发射的捕获.. 我不明白这是什么问题。如果有人可以提供帮助,那就太好了。

2 个答案:

答案 0 :(得分:0)

我能很快看到的两件事是:

  1. 您传递的错误TeamCity Professional 10.0.5 (build 42677)未在此处定义。
  2. 您在回调函数范围内调用if(__error(error)),它指向this.emit而不是EventEmitter
  3. 您必须将db.query绑定到回调。 执行以下操作将对您有用this 但你还必须修复第一号中提到的“错误”。

答案 1 :(得分:0)

在大多数代码中,您在错误的上下文中使用关键字this。使用function关键字声明的每个函数都有自己的this上下文,因此当在__error内时,您所指的this不是LoadFun } this因此它不是扩展EventEmitter类的类,因此不会发出任何内容。

你可以在调用它们时绑定你的函数,或者使用箭头函数,或者分配给另一个变量,例如将它分配给另一个变量:

function Loadfun(param1, param2, db){
    var self = this;
    function __error(error, row){
        if(error){
           self.emit('error', error);
           return true;
        }
        if(row.length < 1)
           self.emit('failure');
    }
    function doSomething(){
        db.query('select something', callback);
    }
    function callback(err, result){
        if(__error(err))
            return false;
        else
            self.emit('success', result);
    }
    self.doSomething = doSomething;
};