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

我正在挣扎近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”的函数。 该函数根据validation的结果validation一些数据并发出事件。

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

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

这工作。 有谁能够帮助我? 我相信这个解决scheme非常简单。 =(

如果你的意思是在函数b()中的validation过程完成时通知函数a(),那么在validation之后就从b发出事件。
我使用setTimeout()作为asynchronous的例子。

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

事件处理函数总是在发出事件的对象的上下文中调用,在这种情况下是b 。 在你的例子中,你可以简单地做

 function a() { var self = this; ... } 

要记住上下文,但是我假设你的真实代码是不同的,你可能没有把你的事件处理程序指定为闭包,所以你可以在设置它之前将你的处理程序绑定到所需的对象上:

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

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

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