Javascript NodeJS中的事件,事件正在setInterval内发出,但不在setInterval内发出
我对JavaScript和NodeJS非常陌生,我只是想了解NodeJS中的发射器模式。当我尝试每秒使用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;
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)
或类似的方法来确保它是异步发出的。好的,非常感谢