Эмитент события не улавливает событие - PullRequest
0 голосов
/ 22 февраля 2019

Мой 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")
})

Но проблема выше, чем событие, которое не вызывает RIDING_STATUS внутри моего index.js .

Может кто-нибудь, пожалуйста, дайте мне знать, что я здесь делаю неправильно.

1 Ответ

0 голосов
/ 22 февраля 2019

У вас есть состояние гонки.Порядок может быть определен неправильно, однако вы запускаете событие до того, как подключен слушатель.

Следующее не работает (например):

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)
...