2

我为此苦苦挣扎了将近 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!');
    });

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

4

2 回答 2

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();
于 2014-12-21T01:05:55.133 回答
-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 的文档

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

于 2014-12-20T15:10:40.813 回答