1
resposta

Funções Events Emitter, Listener

Estou com dúvidas referente ao funcionamento de funções de evento (Events Emitter, Listener) da classe de eventos. Vou colocar um exemplo para facilitar.

//Exemplo de função do site oficial do nodejs  https://nodejs.dev/en/learn/the-nodejs-event-emitter/
const EventEmitter = require('events');

const eventEmitter = new EventEmitter();

eventEmitter.on('start', (start, end) => {
    setTimeout(()=> console.log('aguardando '), 1000);
    console.log(`started from ${start} to ${end}`);
  });

  eventEmitter.emit('start', 2, 300);

  console.log('fim')
/**
STDOUT        started from 2 to 300
STDOUT        time
STDOUT        aguardando
   */
// Como preciso que ocorra 
/**
STDOUT        started from 2 to 300
STDOUT        aguardando
STDOUT        time
   */

Basicamente eu gostaria de esperar toda execução do listem para aí, sim, poder executar a próxima função, mas também não quero encadear a minha função ao evento. Na minha aplicação real são muitas estruturas encadeadas e eu gostaria de lidar de forma mais linear aguardando o termino de um listem para executar outro.

1 resposta

Oi, Willian! Tudo bem?

Desculpa a demora por um retorno.

No exemplo enviado, o código é executado de forma assíncrona devido ao uso do setTimeout. Isso significa que a execução do código não espera a conclusão do setTimeout antes de continuar para a próxima linha e executa console.log('aguardando') necessariamente após 1000 milissegundos (1 segundo).

Para garantirmos que a função console.log('aguardando') seja executada após o término do evento 'start', como o desejado, podemos mover o setTimeout para dentro da função de callback do evento 'start'. Dessa forma, o código deverá ficar da seguinte maneira:

const EventEmitter = require('events');

const eventEmitter = new EventEmitter();

eventEmitter.on('start', (start, end) => {
  console.log(`started from ${start} to ${end}`);
  setTimeout(() => {
    console.log('aguardando');
    console.log('time');
  }, 1000);
});

eventEmitter.emit('start', 2, 300);

Neste caso, a função console.log('aguardando') e console.log('time') serão executadas após o intervalo de tempo especificado pelo setTimeout, ou seja, depois de 1 segundo.

Espero ter ajudado na compreensão do problema. Caso tenha ficado alguma dúvida, sinta-se à vontade em comunicar, estou à disposição!

Um forte abraço e bons estudos!

Caso este post tenha te ajudado, por favor, marcar como solucionado ✓