【问题标题】:Events in NodeJS, event is being emitted, within setInterval, but not without setIntervalNodeJS中的事件,在setInterval内发出事件,但不是没有setInterval
【发布时间】:2016-07-31 12:54:02
【问题描述】:

我对 JavaScript 和 NodeJS 非常陌生,我只是想了解 NodeJS 中的发射器模式。当我尝试使用setInterval 函数每秒发出一个滴答事件时,程序似乎工作正常:-

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

        var Ticker = function() {
          var self = this;
          setInterval(function() {
            self.emit('tick');
          }, 1000);
        };

        util.inherits(Ticker, EventEmitter)

        var ticker = new Ticker();
        ticker.on('tick', function() {
          console.log('TICK');
        });

但是,当我尝试在不使用 setInterval 方法的情况下发出事件时,我的事件没有被调用:-

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

        var Ticker = function() {
          var self = this;
          self.emit('tick');
        };

        util.inherits(Ticker, EventEmitter)

        var ticker = new Ticker();
        ticker.on('tick', function() {
          console.log('TICK');
        });

请帮忙,我不明白,我错在哪里...... 据我了解,当调用self.emit 时,ticker.on 未注册,因此错过了该事件。如果是这种情况,如何在创建对象时发出事件?

【问题讨论】:

  • 提示:继承时你应该在你的构造函数中调用父构造函数,以防它需要执行自己的初始化。在这种特殊情况下,这意味着在构造函数 (Ticker()) 中添加 EventEmitter.call(this);
  • 您好,我尝试使用您的提示,在构造函数中,它显示错误提示ticker.on 不是函数

标签: javascript node.js dom-events eventemitter


【解决方案1】:

JavaScript 是(大部分*)同步语言,除非另有说明,代码从上到下运行,只有异步事件排队等待以后。

如果没有 setInterval 将 emit() 排队以备后用,您将拥有如下内容:

create Ticker
Ticker.emit()
Ticker.on(...)

所以基本上,.emit() 是同步发生的,在第一次调用 .on() 之前发生。


*主要是因为在 ES2015 中我们有 Promises,它是一种用于描述异步事物的语言级构造,但是,对于您正在观察的问题而言,这并不重要。

【讨论】:

  • 好的,感谢您的回复,但是如果我必须在创建对象时发出事件,我该怎么办?
  • 使用setTimeout(() => this.emit(), 0) 或类似的东西来确保它是异步发出的。
  • 好的,非常感谢
【解决方案2】:

如何在创建对象时发出事件

你已经知道答案了。在触发它之前听那个事件。没有其他解决方案。异步触发emit 只是更麻烦的一个。而且,我不建议在 nodejs 上编写 ES5。

let Event = require('event');
class Ticker extends Event{
    constructor(){
        super();
        this.on('tick', () => {
          console.log('TICK');
        });
        this.emit('tick');
    }
}
new Ticker();

// or better
class Ticker extends Event{
    constructor(){
        super();
    }
}
var ticker = new Ticker();
ticker.on('tick', () => {
  console.log('TICK');
});
ticker.emit('tick');

【讨论】:

    【解决方案3】:

    事实上,您需要有人来发出事件。 可以是函数,setInterval,setTimeout等。

    事件发射器的用途只是绑定所有这些功能, 当某人发出给定事件时调用..

    因此,您总是需要有人来发出事件。

    【讨论】:

      猜你喜欢
      • 2020-07-14
      • 2018-12-01
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多