事件没有被发出,或者它们没有被捕获 nodej



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

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

这工作得很好,没有任何错误。 我尝试记录流直到成功发出但捕获事件发出没有被记录。. 我不明白问题是什么..如果有人能帮忙就好了。

我可以快速看到的两件事是:

  1. 您正在传递一个未在此处定义的错误if(__error(error))
  2. 您在回调函数作用域中调用this.emit,它指向db.query而不是事件发射器

您必须将this绑定到回调。 执行以下操作将适用于您db.query('select something', callback.bind(this));但是您还必须修复第一条中提到的"错误"。

在大多数代码中,您在错误的上下文中使用了关键字this。使用function关键字声明的每个函数都有自己的this上下文,因此例如,在__error内部时,您所引用的this不是LoadFunthis,因此它不是扩展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;
};

最新更新