NodeJS中的事件在setInterval中发出,但不是没有setInterval

我对JavaScript和NodeJS非常陌生,我只是想了解NodeJS中的发射器模式。 当我尝试每秒发出一个tick事件时,使用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未注册,因此事件被错过。 如果是这种情况,在创build对象时如何发出事件。

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

你已经知道了答案。 在触发之前先听一下这个事件。 没有其他解决scheme。 asynchronous发射emit只是一个更混乱的。 另外,我不build议在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'); 

JavaScript是一种(主要是*)同步语言,除非另有规定,代码从上到下运行,只有asynchronous事件在稍后排队。

没有setInterval排队emit()为以后,你有这样的事情:

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

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


*主要是因为在ES2015中我们有Promise,它是一种用于描述asynchronous事件的语言级别的构造,但是对于您正在观察的问题来说,这并不重要。