【问题标题】:events are not getting emitted or they not getting caught nodejs事件没有被发出或者他们没有被捕获 nodejs
【发布时间】:2018-03-01 11:52:29
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript node.js express events eventemitter


    【解决方案1】:

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

    1. 您传递的错误if(__error(error)) 未在此处定义。
    2. 您在回调函数范围内调用 this.emit,它指向的是 db.query 而不是 EventEmitter

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

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回复.. 问题出在 this 指针上.. 现在可以正常工作了 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    相关资源
    最近更新 更多