我不知道我的代码有什么问题。
// 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();
});
这完全正常,没有任何错误。 我尝试记录流程直到发出成功 但是没有记录事件发射的捕获.. 我不明白这是什么问题。如果有人可以提供帮助,那就太好了。
答案 0 :(得分:0)
我能很快看到的两件事是:
TeamCity Professional 10.0.5 (build 42677)
未在此处定义。 if(__error(error))
,它指向this.emit
而不是EventEmitter 您必须将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;
};