I spent months writing async Node.js code without really understanding it. Then a production bug taught me the event loop the hard way. Here's what you need to know: Node.js is single-threaded — but it handles thousands of concurrent requests without freezing. How? The event loop. It has 4 key parts: 1. Call Stack — Your sync code runs here, line by line. One thing at a time. 2. libuv Thread Pool — Async tasks (file I/O, HTTP requests) get offloaded here. Your code keeps running. 3. Microtask Queue — Promise callbacks live here. They run BEFORE anything else queued. 4. Macrotask Queue — setTimeout and setInterval callbacks wait here. This explains a classic JS gotcha: console.log('1') setTimeout(() => console.log('2'), 0) Promise.resolve().then(() => console.log('3')) console.log('4') Output: 1 → 4 → 3 → 2 The Promise fires before the setTimeout — even with a 0ms delay. Once you understand this, a whole category of async bugs just... disappears. What part of async JavaScript tripped you up most? Drop it below 👇 #NodeJS #JavaScript #WebDevelopment #SoftwareEngineering #FullStack
Understanding Node.js Event Loop and Async JavaScript
More Relevant Posts
-
🚀 Understanding Node.js Internals: Event Loop & Thread Pool This week, I took a deeper dive into how Node.js actually works behind the scenes — and it completely changed how I think about asynchronous code. 🔹 JavaScript in Node.js runs on a single thread 🔹 Yet it handles multiple tasks efficiently using the Event Loop 🔹 Heavy operations are offloaded to the Thread Pool (via libuv) Some key takeaways: Event Loop manages execution in phases (Timers, I/O, setImmediate, etc.) setTimeout(0) is not truly immediate setImmediate() behaves differently inside vs outside I/O process.nextTick() runs before the event loop even starts Understanding these concepts makes async behavior much more predictable and helps write better backend code. Would love to hear your thoughts or corrections 🙌! Blog Link : https://lnkd.in/gxBA4DeT #JavaScript #WebDev #LearnInPublic #Blog #libuv #EventLoop #ThreadPool #ChaiCode Thanks to Hitesh Choudhary, Piyush Garg, Jay Kadlag, Akash Kadlag for guidance 😊
To view or add a comment, sign in
-
-
Node.js Event Loop — One Concept Every Developer Should Know 🧠 Many developers get confused about this: Why does Promise run before setTimeout? Example 👇 console.log("Start"); setTimeout(() => console.log("Timeout"), 0); Promise.resolve().then(() => console.log("Promise")); console.log("End"); Output: Start → End → Promise → Timeout Why? Because JavaScript has 2 queues: ✔ Microtask Queue (Promises, async/await) ✔ Macrotask Queue (setTimeout, setInterval) Rule: 👉 Microtasks run before Macrotasks This is why Promise executes before setTimeout, even if timeout is 0ms. Understanding this helps in: ✔ Debugging async issues ✔ Writing better Node.js code ✔ Handling real-time applications 👇 Did this confuse you before learning event loop? #nodejs #javascript #eventloop #backenddeveloper #webdevelopment
To view or add a comment, sign in
-
Most developers don’t misunderstand JavaScript. They misunderstand time. . Take setTimeout vs setImmediate. On the surface, they look interchangeable. “Just run this later,” right? That’s the lie. Here’s the reality: setTimeout(fn, 0) → runs after the current call stack + timers phase setImmediate(fn) → runs in the check phase, right after I/O So under load or inside I/O cycles… they don’t behave the same at all. Example: You’re handling a heavy I/O operation (like reading a file or API response). setTimeout → might delay execution unpredictably setImmediate → executes right after the I/O completes One is scheduled. The other is strategically placed in the event loop. That difference? It’s the kind that causes race conditions no one can reproduce. Most people write async code. Very few understand when it actually runs. And that’s where bugs live. #JavaScript #NodeJS #Async #SoftwareEngineering #Backend
To view or add a comment, sign in
-
-
I spent months treating TypeScript like "JavaScript with autocomplete." These 7 tips are what changed that. Swipe through if you've ever written any just to stop the red squiggles. 👇 What's in the carousel: → unknown over any — and why it matters → Discriminated unions for bulletproof state modeling → The satisfies operator (hidden gem) → ReturnType<>, Awaited<>, infer — stop rewriting types you already have → as const + template literal types for zero-cost type safety → 5 tsconfig wins you can add today If you're working with React, Next.js, or Node — these apply directly to your day-to-day code. Save this for the next time you reach for any. 🔖
To view or add a comment, sign in
-
𝗟𝗲𝘁’𝘀 𝘁𝗮𝗹𝗸 𝗮 𝗹𝗶𝘁𝘁𝗹𝗲 𝗯𝗶𝘁 𝗮𝗯𝗼𝘂𝘁 𝗡𝗼𝗱𝗲.𝗷𝘀! 𝐓𝐨𝐩𝐢𝐜 𝟏: 𝐓𝐡𝐞 𝐍𝐨𝐝𝐞.𝐣𝐬 𝐄𝐯𝐞𝐧𝐭 𝐋𝐨𝐨𝐩 It’s a meticulously ordered cycle of 6 steps - and most developers have never seen the part that goes between each one. ⚙️ 𝘛𝘩𝘦 6 𝘚𝘵𝘦𝘱𝘴: 1️⃣ 𝘛𝘪𝘮𝘦𝘳𝘴: Recalls setTimeout / setInterval whose delay has passed 2️⃣ 𝘈𝘸𝘢𝘪𝘵𝘪𝘯𝘨 callbacks: Recalls I/O errors that were rejected from the previous iteration 3️⃣ 𝘗𝘰𝘭𝘭𝘪𝘯𝘨: Retrieves new I/O events. This is where Node.js waits when idle. 4️⃣ 𝘊𝘩𝘦𝘤𝘬: setImmediate callbacks, always after Poll 5️⃣ 𝘊𝘭𝘰𝘴𝘦 𝘊𝘢𝘭𝘭𝘣𝘢𝘤𝘬𝘴: socket.on('close'), cleanup handlers 💠The hidden layer: microtasks Between each step, before the loop progresses, Node.js completely empties the microtask queue. Two subqueues, processed in exact order: ➡️ process.nextTick() callbacks - always first ➡️ Promise resolution callbacks - second This means that microtasks have a higher priority than any step of the Event Loop. 📌 𝘛𝘩𝘦 𝘳𝘶𝘭𝘦𝘴 𝘰𝘧 𝘵𝘩𝘶𝘮𝘣: ➡️ process.nextTick() is fired before Promises, even if Promise resolved first. ➡️ setImmediate() is always fired after I/O callbacks in the same iteration. ➡️ The order of setTimeout(fn, 0) and setImmediate() is not deterministic outside of I/O callbacks. ➡️ Never use nextTick() recursively in production code. The event loop is why Node.js can handle thousands of simultaneous connections on a single thread. Controlling its execution order is the difference between writing asynchronous code and understanding it. #nodejs #javascript #backend #eventloop #softwareengineering #webdevelopment
To view or add a comment, sign in
-
-
𝑨𝒔𝒚𝒏𝒄𝒉𝒓𝒐𝒏𝒐𝒖𝒔 𝑱𝑺 (1) 🚀 𝑼𝒏𝒅𝒆𝒓𝒔𝒕𝒂𝒏𝒅𝒊𝒏𝒈 𝑪𝒂𝒍𝒍𝒃𝒂𝒄𝒌𝒔 𝒊𝒏 𝑱𝒂𝒗𝒂𝑺𝒄𝒓𝒊𝒑𝒕 (𝑻𝒉𝒆 𝑮𝒐𝒐𝒅 & 𝑻𝒉𝒆 𝑩𝒂𝒅) While diving deeper into asynchronous JavaScript, I explored one of the most fundamental concepts — Callbacks. 👉 𝑾𝒉𝒚 𝒄𝒂𝒍𝒍𝒃𝒂𝒄𝒌𝒔? JavaScript is synchronous by default, but callbacks help us perform operations asynchronously — like API calls, timers, or event handling. ✔️ 𝑮𝒐𝒐𝒅 𝑷𝒂𝒓𝒕: Callbacks allow us to: Handle async operations smoothly Execute code only after a task is completed Build real-world flows like order → payment → confirmation 🛒 𝑬𝒙𝒂𝒎𝒑𝒍𝒆: 𝘊𝘳𝘦𝘢𝘵𝘦 𝘰𝘳𝘥𝘦𝘳 → 𝘗𝘳𝘰𝘤𝘦𝘦𝘥 𝘵𝘰 𝘱𝘢𝘺𝘮𝘦𝘯𝘵 → 𝘚𝘩𝘰𝘸 𝘴𝘶𝘮𝘮𝘢𝘳𝘺 → 𝘜𝘱𝘥𝘢𝘵𝘦 𝘸𝘢𝘭𝘭𝘦𝘵 ❌ But here’s the catch… 👉 1. 𝑪𝒂𝒍𝒍𝒃𝒂𝒄𝒌 𝑯𝒆𝒍𝒍 (𝑷𝒚𝒓𝒂𝒎𝒊𝒅 𝒐𝒇 𝑫𝒐𝒐𝒎) When callbacks are nested inside each other, the code becomes: Hard to read Difficult to debug Painful to maintain 👉 2. 𝑰𝒏𝒗𝒆𝒓𝒔𝒊𝒐𝒏 𝒐𝒇 𝑪𝒐𝒏𝒕𝒓𝒐𝒍 We pass our logic into another function (like an API), and: We lose control over when/if it's executed We blindly trust external code This can lead to unexpected bugs 💡 𝐊𝐞𝐲 𝐋𝐞𝐚𝐫𝐧𝐢𝐧𝐠: Callbacks are powerful, but not scalable for complex flows. This is exactly why concepts like Promises and Async/Await were introduced. 🔥 Currently leveling up my async JS fundamentals step by step. Next stop → Promises! #JavaScript #AsyncJS #FrontendDevelopment #ReactJS #WebDevelopment #CodingJourney #Developers #LearningInPublic
To view or add a comment, sign in
-
-
📌 Pyramid of Doom (Callback Hell) A situation where multiple asynchronous callbacks are nested inside each other, creating a pyramid-like structure. ❌ Hard to read and understand ❌ Difficult to debug ❌ Poor error handling ❌ Not scalable as the project grows ✅ Use **Promises** to flatten the structure ✅ Prefer **Async/Await** for cleaner, readable code ✅ Handle errors properly with try/catch Clean code isn’t optional — it’s what makes your backend scalable. 🚀 🔖 Save this for later #javascript #developer #architect #nodejs #mern #mmdanish
To view or add a comment, sign in
-
most developers don't understand closures and it breaks their loops. classic problem: everyone uses let now so this fixes itself but the problem is still there, just hidden. here's why it happens: - when you use var > it's function-scoped not block-scoped. - by the time the timeout runs, the loop is done and i is 3. - all three callbacks reference the fix with let: let is block-scoped so each iteration gets its own i . but here's what you should actually know: - this isn't a JavaScript problem. this is a closure problem. - every function closes over the variables around it. - understanding that changes everything about how you debug async code, event listeners, callbacks. stop memorizing the fix. understand why it happens. #javascript #typescript #webdevelopment #buildinpublic #reactjs
To view or add a comment, sign in
-
-
I was repeating the same logic in every component… and it started getting messy 😅 Yes, seriously. For a long time, I was doing this in React: useEffect(() => { fetchData(); }, []); const [data, setData] = useState(); const [loading, setLoading] = useState(false); Same pattern… in multiple components ❌ ⚠️ This caused: • Code duplication • Hard-to-maintain components • Bigger, messy files 💡 Then I changed my approach: Instead of repeating logic everywhere, 👉 I created a custom hook 🧠 Example: useFetch(url) Handles: • API call • Loading state • Error handling ✅ Result: • Cleaner components • Reusable logic • Easier maintenance 🔥 What I learned: If you’re repeating the same logic… you’re probably missing a custom hook. #ReactJS #FrontendDeveloper #JavaScript #CodingTips #WebDevelopment
To view or add a comment, sign in
-
Stop writing React like it's 2021. 🛑 The ecosystem has evolved. If you want a cleaner, more performant codebase, it is time to upgrade your patterns: 🔄 Data Fetching: useEffect ❌ TanStack Query ✅ 🧠 Global State: Context API ❌ Zustand ✅ 📝 Forms: useState / useRef spam ❌ React Hook Form / React 19 Actions ✅ ⚡ Performance: useMemo / useCallback ❌ React Compiler ✅ 🎨 Styling: CSS-in-JS / bloated SCSS ❌ Tailwind CSS ✅ 🛡️ Validation: Manual checks & any ❌ Zod + TypeScript ✅ Less boilerplate. Fewer unnecessary re-renders. Better developer experience. What is a tool or pattern you finally stopped using this year? 👇 #ReactJS #WebDevelopment #Frontend #TypeScript #TailwindCSS
To view or add a comment, sign in
Explore content categories
- Career
- Productivity
- Finance
- Soft Skills & Emotional Intelligence
- Project Management
- Education
- Technology
- Leadership
- Ecommerce
- User Experience
- Recruitment & HR
- Customer Experience
- Real Estate
- Marketing
- Sales
- Retail & Merchandising
- Science
- Supply Chain Management
- Future Of Work
- Consulting
- Writing
- Economics
- Artificial Intelligence
- Employee Experience
- Workplace Trends
- Fundraising
- Networking
- Corporate Social Responsibility
- Negotiation
- Communication
- Engineering
- Hospitality & Tourism
- Business Strategy
- Change Management
- Organizational Culture
- Design
- Innovation
- Event Planning
- Training & Development