Node.js - 从另一个函数/对象发出一个事件

时间:2014-12-20 12:40:47

标签: javascript node.js eventemitter emit

我挣扎了近2个小时并且仍然没有得到它。=(为了解释我得到了以下代码。

var util = require('util');
var events = require('events').EventEmitter;

function a (){
    //this is my first function
    var b_obj = new b();
    b_obj.on('event',function(){
        console.log('Something happened!');
    });
};

function b (){
    //this is my second function
    events.call(this);
    this.emit('event');
};

util.inherits(b, events);
a();

所以我尝试做的是:我得到了一个名为" a"的函数。该函数调用另一个名为" b"的函数。此函数验证某些数据并根据验证结果发出事件。

我发现,听众工作正常,事件发生正确。但是,因为看起来事件是在函数b的上下文中发出的,并且监听器在函数a的上下文中工作。为了进一步调查,我在功能b中添加了以下行:

this.on('event', function(){
        console.log('event emitted!');
    });

这很有效。有谁能够帮我?我确信解决方案非常简单。 =(

2 个答案:

答案 0 :(得分:2)

如果你的意思是在函数b()中的验证过程完成时通知函数a(),那么只需在执行验证后从b发出事件。
我使用setTimeout()作为异步示例。

var EventEmitter = require("events").EventEmitter;
var theEvent = new EventEmitter();

function a(){
  console.log('preparing validation..');
  theEvent.on('validationDone', function(validationResult){
    console.log('validation result is ' + validationResult);  // prints 'validation result is true' in the next 2 sec
  });
  b();
}

function b(){
  setTimeout(function(){
    var result = true;
    theEvent.emit('validationDone', result);
  }, 2000);
}

a();

答案 1 :(得分:-1)

事件处理函数始终在发出事件的对象的上下文中调用,在本例中为b。在你的例子中,你可以简单地做

function a() {
  var self = this;

  ...
}

要记住a的上下文,但我假设您的实际代码不同,并且您可能没有将事件处理程序指定为闭包,因此您可以在设置之前将处理程序绑定到所需的对象:

function a (){
    //this is my first function
    var b_obj = new b();
    b_obj.on('event', handlerFunction.bind(this));
}

在这种情况下,您的handlerFunction将始终在a的上下文中调用。 bind方法返回绑定到您提供的对象的新函数,请参阅Mozilla's documentation

PS。您可能希望在将来发布之前更清楚地表达您的问题并提供更好的示例。