<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: punavwalke</title>
    <description>The latest articles on DEV Community by punavwalke (@punavwalke).</description>
    <link>https://dev.to/punavwalke</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F727977%2Faff9d190-fc33-4523-83b3-405e8ece494b.jpeg</url>
      <title>DEV Community: punavwalke</title>
      <link>https://dev.to/punavwalke</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/punavwalke"/>
    <language>en</language>
    <item>
      <title>Why Promises Exist in JavaScript (The Questions I Had as a Beginner)</title>
      <dc:creator>punavwalke</dc:creator>
      <pubDate>Tue, 28 Apr 2026 15:44:39 +0000</pubDate>
      <link>https://dev.to/punavwalke/why-promises-exist-in-javascript-the-questions-i-had-as-a-beginner-je0</link>
      <guid>https://dev.to/punavwalke/why-promises-exist-in-javascript-the-questions-i-had-as-a-beginner-je0</guid>
      <description>&lt;h2&gt;
  
  
  🔥 The Question That Started It All
&lt;/h2&gt;

&lt;p&gt;When I started learning async JavaScript, I didn’t just want to know &lt;em&gt;how&lt;/em&gt; promises work.&lt;/p&gt;

&lt;p&gt;I kept asking:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Why do promises even exist?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before learning syntax, I wanted to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What problem are they solving?&lt;/li&gt;
&lt;li&gt;Was the old approach really that bad?&lt;/li&gt;
&lt;li&gt;Why was this design needed in the first place?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🤔 The Real Questions I Had
&lt;/h2&gt;

&lt;p&gt;Instead of jumping into syntax, these were my actual doubts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Was callback hell really such a big problem?&lt;/li&gt;
&lt;li&gt;Why didn’t JavaScript just improve callbacks?&lt;/li&gt;
&lt;li&gt;Who designed promises and why?&lt;/li&gt;
&lt;li&gt;Why does &lt;code&gt;.then()&lt;/code&gt; look like this?&lt;/li&gt;
&lt;li&gt;How does async execution even work in a single-threaded language?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚠️ The Problem: Async Code with Callbacks
&lt;/h2&gt;

&lt;p&gt;Before promises, async code often looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;example&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Step 1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Step 2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Step 3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  At First Glance
&lt;/h2&gt;

&lt;p&gt;This works fine.&lt;/p&gt;

&lt;p&gt;So my initial thought was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Why is this considered a problem?”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  💥 The Real Issue (At Scale)
&lt;/h2&gt;

&lt;p&gt;Now imagine real-world applications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple API calls&lt;/li&gt;
&lt;li&gt;Conditional flows&lt;/li&gt;
&lt;li&gt;Error handling at each step&lt;/li&gt;
&lt;li&gt;Retry mechanisms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This quickly turns into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deep nesting&lt;/li&gt;
&lt;li&gt;Hard-to-read logic&lt;/li&gt;
&lt;li&gt;Difficult debugging&lt;/li&gt;
&lt;li&gt;Hard to modify safely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 The issue is not indentation—it’s &lt;strong&gt;loss of flow clarity&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Key Realization
&lt;/h2&gt;

&lt;p&gt;Callback hell is not a problem in small code.&lt;/p&gt;

&lt;p&gt;👉 It becomes a problem when the system grows.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 The Deeper Problem: Inversion of Control
&lt;/h2&gt;

&lt;p&gt;This is the real hidden issue behind callbacks.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 What It Means
&lt;/h2&gt;

&lt;p&gt;With callbacks, you pass your logic to another function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;example&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nf"&gt;doSomething&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;I run later&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you are trusting that function to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Call your code correctly&lt;/li&gt;
&lt;li&gt;Call it only once&lt;/li&gt;
&lt;li&gt;Call it at the right time&lt;/li&gt;
&lt;li&gt;Not break execution flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 You are no longer in control of execution.&lt;/p&gt;

&lt;p&gt;This is called &lt;strong&gt;Inversion of Control&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Why This Becomes a Problem
&lt;/h2&gt;

&lt;p&gt;In small apps, it’s manageable.&lt;/p&gt;

&lt;p&gt;But in large systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Many callbacks depend on each other&lt;/li&gt;
&lt;li&gt;Execution flow becomes distributed&lt;/li&gt;
&lt;li&gt;Debugging becomes unpredictable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 You lose confidence in &lt;em&gt;when and how code runs&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 The Idea Behind Promises
&lt;/h2&gt;

&lt;p&gt;Promises were introduced to solve &lt;strong&gt;two core problems&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Callback Hell (Structure Problem)
&lt;/h3&gt;

&lt;h3&gt;
  
  
  2. Inversion of Control (Trust Problem)
&lt;/h3&gt;




&lt;h2&gt;
  
  
  ⚙️ 1. Fixing Callback Hell: Making Code Readable
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ Callback Style
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;callbackstyle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nf"&gt;api1&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;res1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;api2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;api3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ Promise Style
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;promisestyle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nf"&gt;api1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res1&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;api2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res2&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;api3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res3&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  💡 What Changed?
&lt;/h3&gt;

&lt;p&gt;Instead of nested logic, we now have:&lt;/p&gt;

&lt;p&gt;👉 A &lt;strong&gt;flat, readable flow&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;step 1 → step 2 → step 3&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔒 2. Fixing Inversion of Control: Restoring Predictability
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ⚠️ With Callbacks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;problem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nf"&gt;doSomething&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Executed later&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don’t control:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When it runs&lt;/li&gt;
&lt;li&gt;How many times it runs&lt;/li&gt;
&lt;li&gt;Whether it runs correctly&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  💡 With Promises
&lt;/h3&gt;

&lt;p&gt;Promises give a structured contract:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Either &lt;strong&gt;resolved&lt;/strong&gt; or &lt;strong&gt;rejected&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Executes exactly once&lt;/li&gt;
&lt;li&gt;Chaining is predictable
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;solution&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nf"&gt;api1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res1&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;api2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res2&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;api3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🧠 Key Shift
&lt;/h3&gt;

&lt;p&gt;With promises:&lt;/p&gt;

&lt;p&gt;👉 You don’t hand over control of execution&lt;br&gt;
👉 You define a structured sequence of steps&lt;/p&gt;


&lt;h2&gt;
  
  
  🔗 Why &lt;code&gt;.then()&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;This confused me initially.&lt;/p&gt;

&lt;p&gt;Why:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;thenexample&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nf"&gt;doSomething&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nextStep&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;directcall&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nf"&gt;doSomething&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nextStep&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Insight
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;.then()&lt;/code&gt; creates a &lt;strong&gt;pipeline of execution steps&lt;/strong&gt;, not just a function call.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Compare the Two Approaches
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ Nested Callbacks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nestedfinal&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nf"&gt;step1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;step2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;step3&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Promise Chain
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;chainfinal&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nf"&gt;step1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;step2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;step3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎯 What This Solves
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Flat structure&lt;/li&gt;
&lt;li&gt;Better readability&lt;/li&gt;
&lt;li&gt;Easier debugging&lt;/li&gt;
&lt;li&gt;Predictable execution flow&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🤯 What Finally Clicked for Me
&lt;/h2&gt;

&lt;p&gt;At this point, everything started connecting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Callbacks break at scale&lt;/li&gt;
&lt;li&gt;Promises bring structure&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.then()&lt;/code&gt; creates a pipeline&lt;/li&gt;
&lt;li&gt;Execution flow becomes predictable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 It’s all part of one system design&lt;/p&gt;




&lt;h2&gt;
  
  
  👀 What About async/await?
&lt;/h2&gt;

&lt;p&gt;Just when promises started making sense, I discovered &lt;code&gt;async/await&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It made things even cleaner—but then I realized:&lt;/p&gt;

&lt;p&gt;👉 It is built on top of promises.&lt;/p&gt;

&lt;p&gt;That’s a topic for the next part.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Final Thought
&lt;/h2&gt;

&lt;p&gt;If there’s one lesson from all of this:&lt;/p&gt;

&lt;p&gt;Don’t just ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How do I use this?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Why does this exist?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;👉 That’s where real understanding begins.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔚 Quick Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Callbacks become hard to manage at scale&lt;/li&gt;
&lt;li&gt;Promises solve structure and control issues&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.then()&lt;/code&gt; creates a clean execution pipeline&lt;/li&gt;
&lt;li&gt;Promises restore predictability in async code&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Understanding JavaScript Event Loop (The Way It Finally Clicked for Me)</title>
      <dc:creator>punavwalke</dc:creator>
      <pubDate>Tue, 28 Apr 2026 14:41:12 +0000</pubDate>
      <link>https://dev.to/punavwalke/understanding-javascript-event-loop-the-way-it-finally-clicked-for-me-175g</link>
      <guid>https://dev.to/punavwalke/understanding-javascript-event-loop-the-way-it-finally-clicked-for-me-175g</guid>
      <description>&lt;h2&gt;
  
  
  🔥 The Question That Confused Me
&lt;/h2&gt;

&lt;p&gt;JavaScript is &lt;strong&gt;single-threaded&lt;/strong&gt;…&lt;br&gt;
So how does it handle things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API calls&lt;/li&gt;
&lt;li&gt;Timers&lt;/li&gt;
&lt;li&gt;User interactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…without blocking everything?&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ The Problem
&lt;/h2&gt;

&lt;p&gt;JavaScript can only execute &lt;strong&gt;one thing at a time&lt;/strong&gt; on a single thread.&lt;/p&gt;

&lt;p&gt;If a long-running task blocks the thread, the entire UI freezes.&lt;/p&gt;

&lt;p&gt;👉 But real-world apps don’t work like that.&lt;/p&gt;

&lt;p&gt;So something must be managing &lt;em&gt;when&lt;/em&gt; async code runs.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ What is the Event Loop?
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Event Loop&lt;/strong&gt; is a mechanism that coordinates execution between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;call stack&lt;/strong&gt; (where code runs)&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;task queues&lt;/strong&gt; (where async callbacks wait)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 It doesn’t execute code itself&lt;br&gt;
👉 It decides &lt;em&gt;when&lt;/em&gt; code should be executed&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Core Pieces You Need to Know
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Call Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Where JavaScript executes code&lt;/li&gt;
&lt;li&gt;Follows &lt;strong&gt;LIFO (Last In, First Out)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Runs synchronous code line by line&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. Web APIs
&lt;/h3&gt;

&lt;p&gt;Things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;setTimeout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fetch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;DOM events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 These are handled by the &lt;strong&gt;browser&lt;/strong&gt;, not JavaScript&lt;/p&gt;

&lt;p&gt;Once completed, their callbacks are sent to queues.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Task Queue (Macrotask Queue)
&lt;/h3&gt;

&lt;p&gt;Includes callbacks from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;setTimeout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;setInterval&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;DOM events&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. Microtask Queue
&lt;/h3&gt;

&lt;p&gt;Higher priority queue that includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Promise.then&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;queueMicrotask&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ⚡ Important Rule
&lt;/h3&gt;

&lt;p&gt;👉 &lt;strong&gt;All microtasks are executed before macrotasks&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How It All Works Together
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Synchronous code runs on the &lt;strong&gt;call stack&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Async operations go to &lt;strong&gt;Web APIs&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;When done, callbacks move to &lt;strong&gt;queues&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The Event Loop checks:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;If the call stack is empty&lt;/li&gt;
&lt;li&gt;Then pushes tasks from queues to the stack&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💥 Let’s Test This
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ex1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Timeout&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Promise&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;End&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Pause and predict the output before reading further&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Output
&lt;/h2&gt;

&lt;p&gt;Start&lt;br&gt;
End&lt;br&gt;
Promise&lt;br&gt;
Timeout&lt;/p&gt;




&lt;h2&gt;
  
  
  Step-by-step Breakdown
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;Start&lt;/code&gt; → goes to call stack → executed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;setTimeout&lt;/code&gt; → goes to Web API → callback sent to &lt;strong&gt;task queue&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Promise.then&lt;/code&gt; → goes to &lt;strong&gt;microtask queue&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;End&lt;/code&gt; → executed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now stack is empty 👇&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Event Loop picks &lt;strong&gt;microtasks first&lt;/strong&gt; → &lt;code&gt;Promise&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Then picks &lt;strong&gt;macrotasks&lt;/strong&gt; → &lt;code&gt;Timeout&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  💡 What Finally Clicked for Me
&lt;/h2&gt;

&lt;p&gt;I used to think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;setTimeout(fn, 0)&lt;/code&gt; runs immediately&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But actually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It always waits for the stack to be empty&lt;/li&gt;
&lt;li&gt;And it runs &lt;strong&gt;after microtasks&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This explains so many “weird” async bugs&lt;/p&gt;




&lt;h2&gt;
  
  
  🔚 Simple Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript is single-threaded&lt;/li&gt;
&lt;li&gt;The Event Loop coordinates async execution&lt;/li&gt;
&lt;li&gt;Microtasks have higher priority than macrotasks&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you're learning JavaScript deeply, understanding this changes how you think about async code completely.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
