Welcome to the Linux Foundation Forum!

LFW211 JSNAD CH-9

https://trainingportal.linuxfoundation.org/learn/course/nodejs-application-development-lfw211/nodes-event-system/nodes-event-system?page=7

I have a question regarding the following. The above page says that

`import { once, EventEmitter } from 'events'
const uneventful = new EventEmitter()

await once(uneventful, 'ping')
console.log('pinged!')`

Execution will pause on the line starting await once, until the registered event fires. If it never fires, execution will never proceed past that point.

Am I supposed to see the process keep waiting on the await statement? (What I am experiencing is that I don't see the 'pinged' message but process exists may be because nothing exists to keep the Event loop active)

Best Answer

  • dmsheiko
    dmsheiko Posts: 18
    Answer ✓

    In Chapter 14. Process & Operating System you will probably find the answer to your questions.
    https://trainingportal.linuxfoundation.org/learn/course/nodejs-application-development-lfw211/process-operating-system/process-operating-system?page=4

    Some API's have active handles. An active handle is a reference that keeps the process open. For instance, net.createServer creates a server with an active handle which will stop the process from exiting by itself so that it can wait for incoming requests. Timeouts and intervals also have active handles that keep the process from exiting

    So, in the original question the process terminates immediately without printing 'pinged!' because 'ping' event is not emitted and there are no active handles (i.e. roughly speaking activities that could potentially emit given event)

    The same applies to Question 1. The process remain live as long as there is active timer.

    As for Question 2. It's a bit complicated. As I can see the resource is fetched successfully and 'ping' is emitted indeed. However, the subscription for 'ping' is made after the event is emitted.

    If you rewrite the code following way, you will see 'pinged!' in output

    import { once, EventEmitter } from 'events'
    const uneventful = new EventEmitter()
    
    setImmediate(async () => {
      await once(uneventful, 'ping')
      console.log('pinged!')
    })
    
    try {
      const response = await fetch('https://jsonplaceholder.typicode.com/todos/1')
      const data = await response.json()
      console.log('before emit')
      uneventful.emit('ping')
      console.log('after emit')
    } catch (error) {
      console.error(error)
    }
    

Answers

  • Thanks @abraham.m.joseph for your questions.
    I actually have no answer, but while investigating your questions, I have also faced some understanding
    regarding the 'once' event.

    Question 1. Why the process is alive for 5 seconds. As there should not be any relation between the

    setTimeout and await once(uneventful, 'ping')

    import { once, EventEmitter } from 'events'
    const uneventful = new EventEmitter()
    
    setTimeout(() => {
    
    }, 5000)
    
    await once(uneventful, 'ping')
    

    Question 2. Let's forget about the setTimeout, Now if I make a fake API call and fire an emit event after the response is successful, Why the "pinged!" is not printed in console.

    import { once, EventEmitter } from 'events'
    const uneventful = new EventEmitter()
    
    try {
      const response = await fetch('https://jsonplaceholder.typicode.com/todos/1')
      const data = await response.json()
      uneventful.emit('ping')
    } catch (error) {
    }
    
    await once(uneventful, 'ping')
    console.log('pinged!')
    
  • Thanks a lot, @dmsheiko. got it.

  • Thanks a lot raselkarim7 for your thought provoking questions and @dmsheiko for the answers. I understand better now.

  • xdxmxc
    xdxmxc Posts: 157

    absolutely right @dmsheiko

Categories

Upcoming Training