Skip to main content

Phases of Node.js Event Loop

We know that a Node.js application is run in a single-threaded fashion. But, it can handle multiple asynchronous operations in the background and exhibits features as if it is a multi-threaded application. At the base level, Node.js is built on C++ which actually allows the existence of multiple threads. While that's not the actual basis, Node.js utilizes the libuv library that allows it to interact with the operating system and utilize available resources efficiently. The library enables asynchronous I/O operations such as file reading, database querying, data transferring over the network, and so on, then it will trigger the registered callback for each completed I/O operation to run. Node.js manage all the callbacks in a mechanism called "event loop".

An event loop is a loop of sequential processes which are grouped into several phases. It handles callbacks of asynchronous I/O operations and asynchronous calls initiated by objects or functions in the main application itself. The phases are as follows.

1. Poll

In this phase, the callbacks from I/O operations are executed. The functions from the main scope of the application are also executed here. There are also two primary microtasks here. The first is the execution of functions called by process.nextTick() that have the highest priority. The second is the execution of callbacks fired by resolve or reject of the Promises. It has a higher priority compared to the callback from I/O operations.

2. Check

This phase will check whether callbacks from the setImmediate() function exists.

3. Close

It will execute callbacks of the close events that are fired by EventEmitter.

4. Timers

In this phase, callbacks of the setTimeout() and setInterval() are called.

5. Pending

Callbacks of specific system events are called in this phase.

Phases of Event Loop

All registered callbacks in a phase will be completely executed before going to the next phase. Let's take a look at the following example.

const fs = require('fs');

setImmediate(() => { console.log('immediate'); });
Promise.resolve().then(() => { console.log('resolve'); });
process.nextTick(() => { console.log('nexttick1'); });
process.nextTick(() => { console.log('nexttick2'); });
fs.readFile(__filename, () => {
  console.log('readfile');
  setTimeout(() => { console.log('timeout'); });
  setImmediate(() => { console.log('immediate2'); });
});

If we align with the phases described before, the result would be:

nexttick1
nexttick2
resolve
immediate
readfile
immediate2
timeout

Notice that callback of the fs.readFile() is run the last while it would be in the poll phase as an I/O operation callback. It is because the callback is registered in the event loop when the actual I/O operation which is reading a file has been completed and returns the result. Meanwhile, the process.nextTick() method which is called in the third order comes out first. The last setImmediate() method comes before the setTimeout() method, aligning with the phase order.

Comments

  1. This article offers a helpful introduction to the Node.js event loop and explains how asynchronous I/O operations allow applications to handle multiple tasks efficiently without blocking the main JavaScript thread. Understanding the roles of libuv, the poll phase, and the check phase helps developers reason about callback execution and asynchronous behavior. These concepts are particularly valuable when building applications that handle network requests, database operations, and other I/O-intensive workloads.

    For developers who want to strengthen their understanding of asynchronous programming, a Nodejs Course can help build practical skills in event-driven architecture, promises, callbacks, and non-blocking operations. Learning these fundamentals makes it easier to identify performance bottlenecks and write responsive server-side applications.

    ReplyDelete
  2. Understanding how the event loop works is also useful when developing web APIs and backend services. An Expressjs Course can help developers apply Node.js concepts to routing, middleware, and request handling while building web applications. Combining event-loop knowledge with Express.js development provides a practical foundation for creating efficient, maintainable backend services.

    ReplyDelete

Post a Comment

Popular posts from this blog

Deploying a Web Server on UpCloud using Terraform Modules

In my earlier post , I shared an example of deploying UpCloud infrastructure using Terraform from scratch. In this post, I want to share how to deploy the infrastructure using available Terraform modules to speed up the set-up process, especially for common use cases like preparing a web server. For instance, our need is to deploy a website with some conditions as follows. The website can be accessed through HTTPS. If the request is HTTP, it will be redirected to HTTPS. There are 2 domains, web1.yourdomain.com and web2.yourdomain.com . But, users should be redirected to "web2" if they are visiting "web1". There are 4 main modules that we need to set up the environment. Private network. It allows the load balancer to connect with the server and pass the traffic. Server. It is used to host the website. Load balancer. It includes backend and frontend configuration. Dynamic certificate. It is requ...

Increase of Malicious Activities and Implementation of reCaptcha

In recent time, I've seen the increase of malicious activities such as login attempts or phishing emails to some accounts I manage. Let me list some of them and the actions taken. SSH Access Attempts This happened on a server that host a Gitlab server. Because of this case, I started to limit the incoming traffic to the server using internal and cloud firewall provided by the cloud provider. I limit the exposed ports, connected network interfaces, and allowed protocols. Phishing Attempts This typically happened through email and messaging platform such as Whatsapp and Facebook Page messaging. The malicious actors tried to share a suspicious link lured as invoice, support ticket, or something else. Malicious links shared Spammy Bot The actors leverage one of public endpoint on my website to send emails. Actually, the emails won't be forwarded anywhere except to my own email so this just full my inbox. This bot is quite active, but I'm still not sure what...

How To Verify Phone Number for Free Using WhatsApp

If you have a product or business that maintains user information like phone numbers, verifying the validity or ownership of the phone number could become important, as the phone number can be used as an authentication method or targeted marketing channel. The typical phone verification procedure is by generating a code or OTP in our application, sending that OTP to the user's phone, and then the user should insert the OTP in our application for verification. The OTP can be sent to the users through services like SMS or WhatsApp that require a valid phone number. For internet-based communication, WhatsApp has become the de facto standard for sending the OTP. WhatsApp requires its users to have a valid phone number during account creation, and it already has a huge number of users, approximately 3 billion in 2025. Using that common procedure, WhatsApp will charge us for each OTP sent. The cost depends on the country of the target phone number. For Indonesia...

What's Good About Strapi, a Headless CMS

Recently, I've been revisiting Strapi as a solution for building backend systems. I still think this headless CMS can be quite useful in certain cases, especially for faster prototyping or creating common websites like company profiles or e-commerce platforms . It might even have the potential to handle more complex systems. With the release of version 5, I'm curious to know what updates it brings. Strapi has launched a new documentation page, and it already feels like an improvement in navigation and content structure compared to the previous version. That said, there's still room for improvement, particularly when it comes to use cases and best practices for working with Strapi. In my opinion, Strapi stands out with some compelling features that could catch developers' attention. I believe three key aspects of Strapi offer notable advantages. First, the content-type builder feature lets us design the data structure of an entity or database model , including ...

Armin or Commander Erwin

In the moment of conflict in the scout team, who will be revived?

How To Discover Exposed Digital Assets for Free Using Noxtara

If you have a website or public-facing digital assets, you might wonder whether they’re secure and what potential entry points could be at risk. A great first step is to list all the digital assets connected to your main domain. One free tool that can help with this is called Noxtara. It offers a variety of security tools in one integrated dashboard, including a feature for discovering public-facing assets. Creating a free account is simple—just head over to the registration page . If you’ve got a company email that matches the domain you want to scan, it’s best to use that since it makes adding the domain to the Noxtara platform much easier. No worries if you don’t have a company email, though; you can still sign up without a problem. Just keep in mind that when you want to add your company’s domain for scanning, you’ll need to go through a quick DNS record check. Registration Once you’ve registered, you can set up a team and add your domain in the team settings. If the domai...