NodeJS中的事件,事件正在setInterval内发出,但不能没有setInterval

Events in NodeJS, event is being emitted, within setInterval, but not without setInterval

本文关键字:setInterval 事件 但不能 NodeJS      更新时间:2024-04-29

我对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等

事件发射器的使用仅仅是绑定所有这些函数,当某人发出给定事件时调用。。

因此,你总是需要有人来发射事件。