Javascript NodeJS中的事件,事件正在setInterval内发出,但不在setInterval内发出

Javascript NodeJS中的事件,事件正在setInterval内发出,但不在setInterval内发出,javascript,node.js,dom-events,eventemitter,Javascript,Node.js,Dom Events,Eventemitter,我对JavaScript和NodeJS非常陌生,我只是想了解NodeJS中的发射器模式。当我尝试每秒使用setInterval函数发出一个滴答声事件时,程序似乎工作正常:- var util = require('util'), EventEmitter = require('events').EventEmitter; var Ticker = function() { var self = this;

我对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
未注册,因此错过事件。如果是这种情况,我如何在创建对象时发出事件?

JavaScript是一种(主要是*)同步语言,除非另有规定,否则代码从上到下运行,并且只有异步事件在以后排队等待

如果不使用setInterval将
emit()

create Ticker
Ticker.emit()
Ticker.on(...)
因此,基本上,
.emit()
是同步发生的,在第一次调用
.on()
之前


*主要是因为在ES2015中,我们有承诺,这是一种用于描述异步内容的语言级构造,但是,对于您正在观察的问题来说,这并不重要

创建对象时如何发出事件

你已经知道答案了。只需在触发事件之前收听该事件。没有其他解决办法。异步触发
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');

提示:继承时,应该在构造函数中调用父构造函数,以防它需要执行自己的初始化。在这种特殊情况下,这意味着添加
EventEmitter.call(this)
在你的构造函数中(
Ticker()
)。嗨,我试过使用你的提示,在构造函数中,它显示了一个错误,说Ticker.on不是一个函数OK,谢谢你的回答,但是当我的对象被创建时,如果我必须发出一个事件,我该怎么办?使用
setTimeout(()=>this.emit(),0)
或类似的方法来确保它是异步发出的。好的,非常感谢