NodeJS中的事件,事件正在setInterval内发出,但不能没有setInterval
Events in NodeJS, event is being emitted, within setInterval, but not without setInterval
我对JavaScript和NodeJS很陌生,我只是想了解NodeJS中的发射器模式。当我尝试使用setInterval
函数每秒发出一个tick事件时,程序似乎运行良好:-
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中,我们有Promises,这是一种用于描述异步内容的语言级构造,但对于您所观察到的问题来说,这并不重要。
创建对象时如何发出事件
你已经知道答案了。在触发该事件之前,只需先听听它。没有其他解决方案。异步发射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');
事实是,您需要有人来发出事件。它可以是一个函数、setInterval、setTimeout等
事件发射器的使用仅仅是绑定所有这些函数,当某人发出给定事件时调用。。
因此,你总是需要有人来发射事件。
相关文章:
- 分派点击事件并保留击键修饰符
- 模糊事件的Javascript测试
- keyup事件处理程序更改焦点不适用于快速键入
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 如何使Javascript动态html表及其上的事件
- 使用类从一个标记中双击事件
- 如何在未直接触发的情况下停止事件
- 事件循环的MEAN.JS setInterval进程(从另一个服务器获取数据)
- 关于性能,最好的方法是什么:setInterval()或body上的全局事件
- Javascript/Jquery删除和添加'onmouseover'setinterval上的事件
- NodeJS中的事件,事件正在setInterval内发出,但不能没有setInterval
- setInterval 不允许同时单击事件 - javascript
- setInterval内的HTML Click事件
- 如何使用 setInterval() 作为事件侦听器
- Can ScriptProcessor's音频处理事件的速度受setInterval或requestAnimat
- 停止setInterval直到事件再次发生
- 悬停事件的SetInterval
- SetInterval方法只在onclick事件上执行一次
- 带有单击事件的Setinterval根本不起作用
- Chrome不'不总是重复事件与JavaScript setInterval()