【问题标题】:Node.js - Emit an event from another function/objectNode.js - 从另一个函数/对象发出事件
【发布时间】:2015-02-19 05:36:18
【问题描述】:

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

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

【问题讨论】:

  • 是的,事件是在obj_b 实例上触发的,这是所有侦听器的上下文。
  • @Bergi:问题不是this的值,而是emiton调用的相对时间,所以不是重复的。
  • @icktoofay:我一定误解了“上下文”这个词,是的。尽管emit 是同步的,但我已经想知道“监听器工作正常且事件正确”是如何实现的。

标签: javascript node.js eventemitter emit


【解决方案1】:

如果您的意思是在函数 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();

【讨论】:

  • 在 Node.js 中,你可能会使用 process.nextTick
  • 当然在实际用例中我们应该使用 process.nextTick 而不是 setTImeout 0ms。我只是以 theEvent 将在接下来的 2 秒内发出事件为例。
【解决方案2】:

事件处理函数总是在发出事件的对象的上下文中调用,在本例中为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。在以后发布之前,您可能希望更清楚地表达您的问题并提供更好的示例。

【讨论】:

  • 您好安东尼,感谢您的回复。但我不明白。添加'var self = this;'没有改变任何东西。另外我用'.bind(this)'尝试了它。它仍然无法正常工作。如果您告诉我不清楚的地方,我会尝试更详细地解释。
  • 问题在于时机,而不是this的值。
  • 真正的问题是问得不好的问题,我也注意到在设置侦听器之前发出了事件,但假设问题实际上是关于上下文/this 值。
猜你喜欢
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
相关资源
最近更新 更多