事件发射器未捕获事件

时间:2019-02-22 09:32:24

标签: javascript node.js eventemitter

我的 emitter.js 文件

const EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();
export default event

我还有另一个文件,其中emit是我在api路由内的事件

import Emitter from '../../config/emitter'

Emitter.emit('RIDING_STATUS', socketdriver)

在这里,我在 index.js

中捕获了该事件
import Emitter from '../config/emitter'

Emitter.on('RIDING_STATUS', async(data) => {
  console.log("Caught the event")
})

但是问题是上述事件不会触发我的 index.js 内部的RIDING_STATUS

有人可以让我知道我在这里做错了吗。

1 个答案:

答案 0 :(得分:1)

您有比赛条件。顺序可能没有很好地定义,但是您是在附加侦听器之前触发事件。

以下操作无效(例如):

const EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();

event.emit('RIDING_STATUS');

//will never be triggered as the emit has already been fired.
event.on('RIDING_STATUS', async(data) => {
  console.log("Caught the event")
});

要确保仅在附加侦听器后才发出事件,请将其放入setTimeout

const EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();

//Delay the emit event until after all setup code is complete
setTimeout(()=>event.emit('RIDING_STATUS'),0);

event.on('RIDING_STATUS', async(data) => {
  console.log("Caught the event")
});

setTimeout可确保在触发事件发射器之前完成所有设置代码。

因此,要在上面引用您的代码,代码的中间块应为:

import Emitter from '../../config/emitter'

setTimeout(()=>Emitter.emit('RIDING_STATUS', socketdriver),0)