<?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: Emily Scott</title>
    <description>The latest articles on DEV Community by Emily Scott (@idioms).</description>
    <link>https://dev.to/idioms</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%2F3782168%2Fc2524324-8382-4140-9dd7-da4d4234ef2f.png</url>
      <title>DEV Community: Emily Scott</title>
      <link>https://dev.to/idioms</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/idioms"/>
    <language>en</language>
    <item>
      <title>Why JavaScript IntersectionObserver Is Not Triggering (And How to Fix It)</title>
      <dc:creator>Emily Scott</dc:creator>
      <pubDate>Fri, 24 Apr 2026 10:29:01 +0000</pubDate>
      <link>https://dev.to/idioms/why-javascript-intersectionobserver-is-not-triggering-and-how-to-fix-it-b5i</link>
      <guid>https://dev.to/idioms/why-javascript-intersectionobserver-is-not-triggering-and-how-to-fix-it-b5i</guid>
      <description>&lt;p&gt;A less common but very frustrating frontend problem developers face is this:&lt;/p&gt;

&lt;p&gt;You set up &lt;code&gt;IntersectionObserver&lt;/code&gt;, but it never triggers.&lt;/p&gt;

&lt;p&gt;No callback.&lt;/p&gt;

&lt;p&gt;No lazy loading.&lt;/p&gt;

&lt;p&gt;No infinite scroll.&lt;/p&gt;

&lt;p&gt;Nothing happens.&lt;/p&gt;

&lt;p&gt;This issue appears a lot in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Infinite scrolling&lt;/li&gt;
&lt;li&gt;Lazy loading images&lt;/li&gt;
&lt;li&gt;Scroll animations&lt;/li&gt;
&lt;li&gt;Ad tracking&lt;/li&gt;
&lt;li&gt;Analytics events&lt;/li&gt;
&lt;li&gt;Sticky navigation triggers&lt;/li&gt;
&lt;li&gt;Performance optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It feels like your code is correct, but the observer still does nothing.&lt;/p&gt;

&lt;p&gt;Let’s fix it step by step.&lt;/p&gt;




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

&lt;p&gt;Suppose you want to detect when an element enters the screen.&lt;/p&gt;

&lt;p&gt;You write 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;const&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.box&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IntersectionObserver&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;entries&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;entries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;entry&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isIntersecting&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;Element is visible&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="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You expect 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="nx"&gt;Element&lt;/span&gt; &lt;span class="nx"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;visible&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;when the element enters the viewport.&lt;/p&gt;

&lt;p&gt;But instead, nothing happens.&lt;/p&gt;

&lt;p&gt;No logs.&lt;/p&gt;

&lt;p&gt;No trigger.&lt;/p&gt;

&lt;p&gt;Very confusing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Happens
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;IntersectionObserver&lt;/code&gt; only works when:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The target element actually exists&lt;/li&gt;
&lt;li&gt;The element can be observed inside the viewport&lt;/li&gt;
&lt;li&gt;The observer settings are correct&lt;/li&gt;
&lt;li&gt;The CSS layout allows proper visibility detection&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If even one of these breaks, the callback may never run.&lt;/p&gt;

&lt;p&gt;That is usually the real issue.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistake #1: The Element Does Not Exist Yet
&lt;/h2&gt;

&lt;p&gt;This is very common:&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;const&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.box&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;.box&lt;/code&gt; is not rendered yet:&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="nx"&gt;target&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then observation fails silently.&lt;/p&gt;

&lt;p&gt;This is especially common in React and dynamic UI rendering.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Check the Target First
&lt;/h2&gt;

&lt;p&gt;Safer version:&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;const&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.box&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&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;Always confirm the element exists first.&lt;/p&gt;

&lt;p&gt;This solves many issues immediately.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistake #2: Wrong &lt;code&gt;threshold&lt;/code&gt; Value
&lt;/h2&gt;

&lt;p&gt;Developers often use 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;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IntersectionObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Problem:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;threshold: 1&lt;/code&gt; means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Trigger only when 100% of the element is visible&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That often never happens.&lt;/p&gt;

&lt;p&gt;Especially with large elements.&lt;/p&gt;

&lt;p&gt;Very common mistake.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Use a Better Threshold
&lt;/h2&gt;

&lt;p&gt;Safer version:&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;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IntersectionObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Trigger when 10% of the element becomes visible&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Much more practical.&lt;/p&gt;

&lt;p&gt;Much better for real applications.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistake #3: Wrong &lt;code&gt;root&lt;/code&gt; Setting
&lt;/h2&gt;

&lt;p&gt;Some developers set 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="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.container&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;But if that container does not actually scroll, the observer behaves strangely.&lt;/p&gt;

&lt;p&gt;If you want viewport detection, use:&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="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;which means the browser viewport.&lt;/p&gt;

&lt;p&gt;This is usually the correct choice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Use the Viewport Properly
&lt;/h2&gt;

&lt;p&gt;Correct setup:&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;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IntersectionObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean.&lt;/p&gt;

&lt;p&gt;Reliable.&lt;/p&gt;

&lt;p&gt;Production-safe.&lt;/p&gt;




&lt;h2&gt;
  
  
  React Version of This Problem
&lt;/h2&gt;

&lt;p&gt;This happens constantly in React.&lt;/p&gt;

&lt;p&gt;Example:&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="nf"&gt;useEffect&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;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&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;p&gt;Problem:&lt;/p&gt;

&lt;p&gt;Sometimes &lt;code&gt;ref.current&lt;/code&gt; is still &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then the observer never starts.&lt;/p&gt;

&lt;p&gt;Very common bug.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Protect React Refs
&lt;/h2&gt;

&lt;p&gt;Safer version:&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="nf"&gt;useEffect&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&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;p&gt;Always protect refs before observing.&lt;/p&gt;

&lt;p&gt;This saves a lot of debugging time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Another Hidden Problem: CSS Layout Issues
&lt;/h2&gt;

&lt;p&gt;Sometimes the problem is not JavaScript.&lt;/p&gt;

&lt;p&gt;It is CSS.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;display: none&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;overflow: hidden&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Wrong scroll container&lt;/li&gt;
&lt;li&gt;Zero-height elements&lt;/li&gt;
&lt;li&gt;Elements already visible on load&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These directly affect visibility detection.&lt;/p&gt;

&lt;p&gt;Developers often miss this completely.&lt;/p&gt;

&lt;p&gt;Very important.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Debug with &lt;code&gt;entry&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Always inspect the observer data:&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;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IntersectionObserver&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;entries&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;entries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;entry&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;entry&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;p&gt;This helps you check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the callback firing?&lt;/li&gt;
&lt;li&gt;Is &lt;code&gt;isIntersecting&lt;/code&gt; false?&lt;/li&gt;
&lt;li&gt;Is the intersection ratio too small?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This reveals the real issue fast.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Debug Rule
&lt;/h2&gt;

&lt;p&gt;Whenever &lt;code&gt;IntersectionObserver&lt;/code&gt; fails, ask yourself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is the observer broken, or is the element never actually intersecting?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question usually finds the issue immediately.&lt;/p&gt;

&lt;p&gt;Most bugs start there.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;IntersectionObserver&lt;/code&gt; is powerful, but small setup mistakes break everything.&lt;/p&gt;

&lt;p&gt;Remember:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check that the target element exists&lt;/li&gt;
&lt;li&gt;Avoid &lt;code&gt;threshold: 1&lt;/code&gt; unless truly needed&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;root: null&lt;/code&gt; for viewport detection&lt;/li&gt;
&lt;li&gt;Protect React refs&lt;/li&gt;
&lt;li&gt;Check CSS layout issues&lt;/li&gt;
&lt;li&gt;Debug using the full &lt;code&gt;entry&lt;/code&gt; object&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a less common problem, but when it happens, debugging becomes painful.&lt;/p&gt;

&lt;p&gt;Fixing it properly saves serious time.&lt;/p&gt;

&lt;p&gt;Especially in infinite scroll and lazy loading features.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your Turn
&lt;/h2&gt;

&lt;p&gt;Have you ever spent an hour debugging &lt;code&gt;IntersectionObserver&lt;/code&gt; only to realize the element was &lt;code&gt;null&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;That happens more often than developers admit.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Google Cloud Next '26: The Dawn of the Agentic Enterprise</title>
      <dc:creator>Emily Scott</dc:creator>
      <pubDate>Thu, 23 Apr 2026 11:28:24 +0000</pubDate>
      <link>https://dev.to/idioms/google-cloud-next-26-the-dawn-of-the-agentic-enterprise-33dl</link>
      <guid>https://dev.to/idioms/google-cloud-next-26-the-dawn-of-the-agentic-enterprise-33dl</guid>
      <description>&lt;p&gt;&lt;strong&gt;Google Cloud Next '26: The Dawn of the Agentic Enterprise&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google Cloud Next '26, the flagship annual conference for Google Cloud, took place &lt;strong&gt;April 22–24, 2026&lt;/strong&gt;, at the Mandalay Bay Convention Center in Las Vegas. The event attracted tens of thousands of attendees to explore the latest advancements in generative AI, infrastructure, security, data, and cloud computing.&lt;/p&gt;

&lt;p&gt;This year marked a major shift: from generative AI experiments to the &lt;strong&gt;Agentic Enterprise&lt;/strong&gt; — where autonomous AI agents operate at scale to drive real business transformation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Event at a Glance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dates&lt;/strong&gt;: April 22–24, 2026 (pre-events on April 21)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Venue&lt;/strong&gt;: Mandalay Bay Convention Center, Las Vegas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format&lt;/strong&gt;: In-person + live-streamed keynotes, technical sessions, workshops, Expo floor, networking, and evening events&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core Themes&lt;/strong&gt;: Agentic AI, AI infrastructure, data platforms, cybersecurity, developer tools, and Google Workspace&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agenda opened with the &lt;strong&gt;"The Agentic Cloud"&lt;/strong&gt; keynote, &lt;a href="https://www.theidioms.com/follow-by/" rel="noopener noreferrer"&gt;followed by&lt;/a&gt; a Developer Keynote focused on agents in the autonomous era.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Theme: Building the Agentic Enterprise
&lt;/h2&gt;

&lt;p&gt;Google Cloud positioned Next '26 as the launchpad for the &lt;strong&gt;Agentic Enterprise&lt;/strong&gt;. The focus moved beyond chat interfaces to production-grade, multi-step agentic workflows powered by a unified, secure, and scalable AI stack.&lt;/p&gt;

&lt;p&gt;Key momentum stats shared:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nearly 75% of Google Cloud customers use AI products&lt;/li&gt;
&lt;li&gt;Hundreds of customers process trillions of tokens monthly&lt;/li&gt;
&lt;li&gt;First-party models handle over 16 billion tokens per minute via API&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Major Announcements
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Gemini Enterprise Agent Platform
&lt;/h3&gt;

&lt;p&gt;The biggest reveal: a comprehensive platform (evolving Vertex AI) to &lt;strong&gt;build, scale, govern, and optimize&lt;/strong&gt; agents at enterprise scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key capabilities:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent Studio&lt;/strong&gt; — low-code/no-code visual builder&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Developer Kit&lt;/strong&gt; — graph-based logic with natural language support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistent Memory Bank&lt;/strong&gt;, secure sandboxes, sub-second cold starts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cryptographic Agent Identity&lt;/strong&gt;, Agent Registry, and Model Armor protections&lt;/li&gt;
&lt;li&gt;Full observability with OpenTelemetry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also includes the &lt;strong&gt;Gemini Enterprise App&lt;/strong&gt; for business users with inbox-style interactions, scoped Projects, Skills, Canvas, and an Agent Gallery.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. AI Hypercomputer and 8th-Gen TPUs
&lt;/h3&gt;

&lt;p&gt;New purpose-built AI Hypercomputer architecture with two new TPUs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TPU 8t&lt;/strong&gt; (training) — scales to 9,600 chips, 2 PB shared memory, up to 3x performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TPU 8i&lt;/strong&gt; (inference) — optimized for millions of concurrent agents with ultra-low latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additional infrastructure: Virgo networking, Google Cloud Managed Lustre, Rapid Cloud Storage, and Arm-based Axion processors.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Agentic Data Cloud
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Cloud Lakehouse&lt;/strong&gt; (Apache Iceberg) for zero-copy access across clouds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge Catalog&lt;/strong&gt; with dynamic context graphs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lightning Engine for Apache Spark&lt;/strong&gt; — up to 4.5x faster&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Agent Kit&lt;/strong&gt; and &lt;strong&gt;Deep Research Agent&lt;/strong&gt; for intent-driven insights&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Agentic Defense &amp;amp; Security
&lt;/h3&gt;

&lt;p&gt;New cybersecurity platform integrating Google Threat Intelligence with Wiz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Autonomous threat hunting and remediation agents&lt;/li&gt;
&lt;li&gt;Wiz Red/Blue/Green agents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Cloud Fraud Defense&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Model Context Protocol (MCP) support&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Google Workspace Intelligence
&lt;/h3&gt;

&lt;p&gt;Enhanced semantic layer across Gmail, Docs, Drive, Meet, etc., plus new customer-facing and employee agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Customer Impact
&lt;/h2&gt;

&lt;p&gt;Dozens of customer stories were showcased:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GE Appliances&lt;/strong&gt;: 800+ agents in manufacturing &amp;amp; logistics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KPMG&lt;/strong&gt;: 100+ agents in first month with 90% adoption&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Virgin Voyages&lt;/strong&gt;: 1,000+ agents driving 40% faster campaigns&lt;/li&gt;
&lt;li&gt;Wins at Citi, Macquarie, PepsiCo, Unilever, Vodafone, and more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Creative demos included AI performance analysis for Olympic athletes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It Matters
&lt;/h2&gt;

&lt;p&gt;Google Cloud Next '26 delivered a clear blueprint: the agentic future is here. With an open, secure, and massively scalable stack (supporting third-party models and hybrid environments), Google is enabling organizations to move AI from pilots to pervasive, agent-driven operations.&lt;/p&gt;

&lt;p&gt;The innovations announced in Las Vegas will shape enterprise AI strategies for years to come.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What did you think of Google Cloud Next '26?&lt;/strong&gt; Which announcement excited you the most? Drop your thoughts in the comments 👇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Stay tuned for deeper technical deep-dives and &lt;a href="https://www.theidioms.com/hands-on/" rel="noopener noreferrer"&gt;hands-on&lt;/a&gt; codelabs in the coming weeks.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>googlecloud</category>
      <category>cloud</category>
      <category>programming</category>
      <category>news</category>
    </item>
    <item>
      <title>Why JavaScript AbortController Is Not Canceling fetch() Requests (And How to Fix It)</title>
      <dc:creator>Emily Scott</dc:creator>
      <pubDate>Thu, 23 Apr 2026 06:41:02 +0000</pubDate>
      <link>https://dev.to/idioms/why-javascript-abortcontroller-is-not-canceling-fetch-requests-and-how-to-fix-it-45ob</link>
      <guid>https://dev.to/idioms/why-javascript-abortcontroller-is-not-canceling-fetch-requests-and-how-to-fix-it-45ob</guid>
      <description>&lt;p&gt;&lt;strong&gt;Why JavaScript &lt;code&gt;AbortController&lt;/code&gt; Is Not Canceling &lt;code&gt;fetch()&lt;/code&gt; Requests (And How to Fix It)&lt;/strong&gt;&lt;br&gt;
A less common—but very real—problem many developers face is this:&lt;/p&gt;

&lt;p&gt;You try to cancel a &lt;code&gt;fetch()&lt;/code&gt; request, but the request still continues.&lt;/p&gt;

&lt;p&gt;Or worse, the UI updates with old data after the user has already moved on.&lt;/p&gt;

&lt;p&gt;This happens a lot in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search suggestions&lt;/li&gt;
&lt;li&gt;Live filtering&lt;/li&gt;
&lt;li&gt;React components&lt;/li&gt;
&lt;li&gt;Route changes&lt;/li&gt;
&lt;li&gt;Infinite scroll&lt;/li&gt;
&lt;li&gt;File uploads&lt;/li&gt;
&lt;li&gt;Dashboard refreshes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It creates strange bugs that are difficult to trace, especially in modern frontend applications.&lt;/p&gt;

&lt;p&gt;Let’s fix it properly.&lt;/p&gt;


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

&lt;p&gt;Suppose you are building a live search feature.&lt;/p&gt;

&lt;p&gt;You write 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;const&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AbortController&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/search?q=javascript&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="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&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;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&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;data&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;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You expect the request to stop immediately.&lt;/p&gt;

&lt;p&gt;Instead, sometimes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The request still appears in the Network tab&lt;/li&gt;
&lt;li&gt;Old results still render&lt;/li&gt;
&lt;li&gt;Unexpected errors appear&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Very confusing.&lt;/p&gt;

&lt;p&gt;It feels like &lt;code&gt;AbortController&lt;/code&gt; is broken.&lt;/p&gt;

&lt;p&gt;But usually, the real problem is implementation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Happens
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;AbortController&lt;/code&gt; does not magically stop everything.&lt;/p&gt;

&lt;p&gt;It only tells &lt;code&gt;fetch()&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cancel this request if possible&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When the request is aborted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Promise rejects&lt;/li&gt;
&lt;li&gt;An error is thrown&lt;/li&gt;
&lt;li&gt;Your &lt;code&gt;.then()&lt;/code&gt; chain may still behave unexpectedly if not handled correctly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many developers forget this part.&lt;/p&gt;

&lt;p&gt;That causes bugs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistake #1: Forgetting to Handle the Abort Error
&lt;/h2&gt;

&lt;p&gt;Developers often write 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="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&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;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&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;data&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;setResults&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&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;But they forget &lt;code&gt;.catch()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When the request is aborted, JavaScript throws an error.&lt;/p&gt;

&lt;p&gt;Without proper handling, debugging becomes messy.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Always Handle Abort Errors
&lt;/h2&gt;

&lt;p&gt;Use this instead:&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="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&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;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&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;data&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;setResults&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&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="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AbortError&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;Request was canceled&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="k"&gt;else&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;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&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;p&gt;This is the first and most important fix.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistake #2: Reusing the Same Controller
&lt;/h2&gt;

&lt;p&gt;Wrong approach:&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;const&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AbortController&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&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;The problem is simple:&lt;/p&gt;

&lt;p&gt;Once aborted, that controller stays aborted.&lt;/p&gt;

&lt;p&gt;You cannot safely reuse it.&lt;/p&gt;

&lt;p&gt;Many developers miss this.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Create a New Controller for Every Request
&lt;/h2&gt;

&lt;p&gt;Correct approach:&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;function&lt;/span&gt; &lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AbortController&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;controller&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;Fresh controller.&lt;/p&gt;

&lt;p&gt;Fresh request.&lt;/p&gt;

&lt;p&gt;Much safer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real React Example
&lt;/h2&gt;

&lt;p&gt;This problem happens constantly in React.&lt;/p&gt;

&lt;p&gt;A user types quickly in a search box.&lt;/p&gt;

&lt;p&gt;Older API requests finish later and overwrite newer results.&lt;/p&gt;

&lt;p&gt;That creates bad UX.&lt;/p&gt;

&lt;p&gt;Very common.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Cancel Previous Requests in React
&lt;/h2&gt;

&lt;p&gt;Use this pattern:&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;controller&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleSearch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AbortController&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/api/search?q=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&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;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&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;data&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;setResults&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&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="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AbortError&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;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&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;p&gt;Now only the latest request matters.&lt;/p&gt;

&lt;p&gt;Much cleaner.&lt;/p&gt;

&lt;p&gt;Much safer.&lt;/p&gt;

&lt;p&gt;Better UX.&lt;/p&gt;




&lt;h2&gt;
  
  
  Another Hidden Problem
&lt;/h2&gt;

&lt;p&gt;Some developers think 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="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;cancels JavaScript itself.&lt;/p&gt;

&lt;p&gt;It does not.&lt;/p&gt;

&lt;p&gt;It only affects the network request.&lt;/p&gt;

&lt;p&gt;If your &lt;code&gt;.then()&lt;/code&gt; has already started running, you must still control that logic manually.&lt;/p&gt;

&lt;p&gt;This is a very important detail.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Protect UI Updates
&lt;/h2&gt;

&lt;p&gt;Safer example:&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="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&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;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&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;data&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;aborted&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setResults&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&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;p&gt;This helps prevent stale UI updates.&lt;/p&gt;

&lt;p&gt;Very useful in real applications.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Debug Rule
&lt;/h2&gt;

&lt;p&gt;Whenever old API data appears, ask yourself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Did I cancel the request, or did I only assume it was canceled?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question usually reveals the real issue immediately.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;AbortController&lt;/code&gt; is powerful—but only when used correctly.&lt;/p&gt;

&lt;p&gt;Remember:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always handle &lt;code&gt;AbortError&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Never reuse the same controller&lt;/li&gt;
&lt;li&gt;Create a new controller for each request&lt;/li&gt;
&lt;li&gt;Protect UI updates after aborting&lt;/li&gt;
&lt;li&gt;Especially important in React search and filtering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a less common bug, but when it happens, it becomes a nightmare.&lt;/p&gt;

&lt;p&gt;Fixing it properly saves serious debugging time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your Turn
&lt;/h2&gt;

&lt;p&gt;Have you ever had old API results overwrite new ones in your UI?&lt;/p&gt;

&lt;p&gt;That is usually where the &lt;code&gt;AbortController&lt;/code&gt; lesson begins.&lt;/p&gt;

&lt;p&gt;Thanks for reading,&lt;br&gt;
Emily &lt;a href="https://www.theidioms.com" rel="noopener noreferrer"&gt;Idioms&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>testing</category>
    </item>
    <item>
      <title>Why 'structuredClone()' Is Breaking in JavaScript (And the Right Way to Deep Copy Objects)</title>
      <dc:creator>Emily Scott</dc:creator>
      <pubDate>Wed, 22 Apr 2026 09:33:38 +0000</pubDate>
      <link>https://dev.to/idioms/why-structuredclone-is-breaking-in-javascript-and-the-right-way-to-deep-copy-objects-2fe2</link>
      <guid>https://dev.to/idioms/why-structuredclone-is-breaking-in-javascript-and-the-right-way-to-deep-copy-objects-2fe2</guid>
      <description>&lt;p&gt;A fresh problem many JavaScript developers are facing in modern projects is 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="nx"&gt;ReferenceError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;structuredClone&lt;/span&gt; &lt;span class="nx"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;not&lt;/span&gt; &lt;span class="nx"&gt;defined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or sometimes:&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="nx"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Failed&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;execute&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;structuredClone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This happens a lot in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React projects&lt;/li&gt;
&lt;li&gt;Node.js applications&lt;/li&gt;
&lt;li&gt;API data processing&lt;/li&gt;
&lt;li&gt;State management&lt;/li&gt;
&lt;li&gt;Form handling&lt;/li&gt;
&lt;li&gt;Redux updates&lt;/li&gt;
&lt;li&gt;Deep object cloning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many developers moved from the old cloning method:&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="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to the newer:&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="nf"&gt;structuredClone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But suddenly, production breaks.&lt;/p&gt;

&lt;p&gt;Let’s fix it properly.&lt;/p&gt;




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

&lt;p&gt;Suppose you write 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;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dark&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;copy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;structuredClone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;light&lt;/span&gt;&lt;span class="dl"&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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Expected Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;dark&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because you want a real deep copy.&lt;/p&gt;

&lt;p&gt;But instead, some developers get:&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="nx"&gt;ReferenceError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;structuredClone&lt;/span&gt; &lt;span class="nx"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;not&lt;/span&gt; &lt;span class="nx"&gt;defined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Very frustrating—especially after deploying.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Happens
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;structuredClone()&lt;/code&gt; is a modern JavaScript feature.&lt;/p&gt;

&lt;p&gt;It is supported in newer browsers and newer Node.js versions.&lt;/p&gt;

&lt;p&gt;But older environments may not support it.&lt;/p&gt;

&lt;p&gt;This often happens when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your Node.js version is too old&lt;/li&gt;
&lt;li&gt;The browser is outdated&lt;/li&gt;
&lt;li&gt;Build tools are using older runtimes&lt;/li&gt;
&lt;li&gt;The deployment server differs from your local machine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your code works locally…&lt;/p&gt;

&lt;p&gt;but fails in production.&lt;/p&gt;

&lt;p&gt;Very common.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Developers Prefer &lt;code&gt;structuredClone()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Because this old method has serious problems:&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;const&lt;/span&gt; &lt;span class="nx"&gt;copy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It breaks things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dates&lt;/li&gt;
&lt;li&gt;Maps&lt;/li&gt;
&lt;li&gt;Sets&lt;/li&gt;
&lt;li&gt;Functions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;undefined&lt;/code&gt; values&lt;/li&gt;
&lt;li&gt;Circular references&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&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;const&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&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;After JSON cloning:&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="nx"&gt;createdAt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;becomes a string—not a real &lt;code&gt;Date&lt;/code&gt; object.&lt;/p&gt;

&lt;p&gt;Bad for real applications.&lt;/p&gt;

&lt;p&gt;That is why developers prefer &lt;code&gt;structuredClone()&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Check Your Environment
&lt;/h2&gt;

&lt;p&gt;Before changing code, check your Node.js version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;structuredClone()&lt;/code&gt; works properly in modern Node.js versions.&lt;/p&gt;

&lt;p&gt;If your version is old, upgrade Node.js first.&lt;/p&gt;

&lt;p&gt;This solves the issue for many developers immediately.&lt;/p&gt;

&lt;p&gt;This should always be your first step.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Use the Native Modern Solution
&lt;/h2&gt;

&lt;p&gt;Use 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;const&lt;/span&gt; &lt;span class="nx"&gt;copy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;structuredClone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the best native solution for deep cloning.&lt;/p&gt;

&lt;p&gt;It handles nested objects safely.&lt;/p&gt;

&lt;p&gt;Cleaner.&lt;/p&gt;

&lt;p&gt;Safer.&lt;/p&gt;

&lt;p&gt;More reliable.&lt;/p&gt;

&lt;p&gt;This is the preferred solution for modern JavaScript projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Add a Safe Fallback for Older Environments
&lt;/h2&gt;

&lt;p&gt;If &lt;code&gt;structuredClone()&lt;/code&gt; is unavailable, use a fallback:&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;const&lt;/span&gt; &lt;span class="nx"&gt;copy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;structuredClone&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;function&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nf"&gt;structuredClone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This protects production apps.&lt;/p&gt;

&lt;p&gt;Especially useful when working across mixed environments.&lt;/p&gt;

&lt;p&gt;Very practical.&lt;/p&gt;




&lt;h2&gt;
  
  
  React Example
&lt;/h2&gt;

&lt;p&gt;This matters a lot in React state updates.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wrong Approach
&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;const&lt;/span&gt; &lt;span class="nx"&gt;newState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;oldState&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;newState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Emma&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;This mutates the original state.&lt;/p&gt;

&lt;p&gt;Bad for React.&lt;/p&gt;

&lt;p&gt;It causes unexpected UI bugs.&lt;/p&gt;




&lt;h3&gt;
  
  
  Correct Approach
&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;const&lt;/span&gt; &lt;span class="nx"&gt;newState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;structuredClone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;oldState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;newState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Emma&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;Now state updates safely.&lt;/p&gt;

&lt;p&gt;Much better.&lt;/p&gt;

&lt;p&gt;Less debugging.&lt;/p&gt;

&lt;p&gt;Cleaner React code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Another Common Error
&lt;/h2&gt;

&lt;p&gt;Some values cannot be cloned.&lt;/p&gt;

&lt;p&gt;Example:&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;const&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&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;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;Hello&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="nf"&gt;structuredClone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This may fail.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because functions are not cloneable with &lt;code&gt;structuredClone()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Important rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use it for data—not executable logic.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Very important.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Debug Rule
&lt;/h2&gt;

&lt;p&gt;Whenever cloning breaks, ask yourself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Am I cloning plain data… or special objects like functions and classes?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question finds the issue fast.&lt;/p&gt;

&lt;p&gt;Most bugs start there.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;structuredClone()&lt;/code&gt; is powerful, but environment support matters.&lt;/p&gt;

&lt;p&gt;Remember:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check your Node.js version first&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;structuredClone()&lt;/code&gt; for modern deep copying&lt;/li&gt;
&lt;li&gt;Add fallback support if needed&lt;/li&gt;
&lt;li&gt;Do not clone functions this way&lt;/li&gt;
&lt;li&gt;Avoid relying only on JSON cloning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This small fix prevents huge debugging problems.&lt;/p&gt;

&lt;p&gt;Especially in React and backend applications.&lt;/p&gt;

&lt;p&gt;And it is becoming one of the newest common JavaScript production issues.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your Turn
&lt;/h2&gt;

&lt;p&gt;Have you replaced &lt;code&gt;JSON.parse(JSON.stringify())&lt;/code&gt; with &lt;code&gt;structuredClone()&lt;/code&gt; yet?&lt;/p&gt;

&lt;p&gt;Many developers are making that switch right now.&lt;/p&gt;

&lt;p&gt;Thanks for reading,&lt;br&gt;
Emily &lt;a href="https://www.theidioms.com" rel="noopener noreferrer"&gt;Idioms&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>JavaScript 'Cannot Read Properties of Undefined' Error (How to Fix It Step by Step Guide)</title>
      <dc:creator>Emily Scott</dc:creator>
      <pubDate>Tue, 21 Apr 2026 13:49:40 +0000</pubDate>
      <link>https://dev.to/idioms/javascript-cannot-read-properties-of-undefined-error-how-to-fix-it-step-by-step-guide-3d39</link>
      <guid>https://dev.to/idioms/javascript-cannot-read-properties-of-undefined-error-how-to-fix-it-step-by-step-guide-3d39</guid>
      <description>&lt;p&gt;&lt;strong&gt;JavaScript &lt;code&gt;Cannot Read Properties of Undefined&lt;/code&gt; (How to Fix It Step by Step)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is one of the most common and frustrating JavaScript errors developers face:&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="nx"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Cannot&lt;/span&gt; &lt;span class="nx"&gt;read&lt;/span&gt; &lt;span class="nx"&gt;properties&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It appears suddenly.&lt;/p&gt;

&lt;p&gt;Your code was working.&lt;/p&gt;

&lt;p&gt;Then one missing value breaks everything.&lt;/p&gt;

&lt;p&gt;This happens in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API responses&lt;/li&gt;
&lt;li&gt;React components&lt;/li&gt;
&lt;li&gt;Form handling&lt;/li&gt;
&lt;li&gt;DOM manipulation&lt;/li&gt;
&lt;li&gt;Database results&lt;/li&gt;
&lt;li&gt;Nested objects&lt;/li&gt;
&lt;li&gt;User authentication flows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Almost every JavaScript developer has faced this error.&lt;/p&gt;

&lt;p&gt;Let’s fix it properly.&lt;/p&gt;




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

&lt;p&gt;Suppose you write 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;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Expected Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;New&lt;/span&gt; &lt;span class="nx"&gt;York&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Actual Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Cannot&lt;/span&gt; &lt;span class="nx"&gt;read&lt;/span&gt; &lt;span class="nx"&gt;properties&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nf"&gt;undefined &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reading&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;city&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;Very annoying.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because &lt;code&gt;address&lt;/code&gt; does not exist.&lt;/p&gt;

&lt;p&gt;JavaScript tries to read 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="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that causes the crash.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Happens
&lt;/h2&gt;

&lt;p&gt;JavaScript reads objects step by step.&lt;/p&gt;

&lt;p&gt;This line:&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="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;means:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find &lt;code&gt;user&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Find &lt;code&gt;address&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Find &lt;code&gt;city&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But if step 2 returns &lt;code&gt;undefined&lt;/code&gt;, step 3 fails immediately.&lt;/p&gt;

&lt;p&gt;JavaScript cannot read properties from &lt;code&gt;undefined&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That is the root problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Example
&lt;/h2&gt;

&lt;p&gt;This happens constantly with APIs.&lt;/p&gt;

&lt;p&gt;Example:&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;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchUser&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks normal.&lt;/p&gt;

&lt;p&gt;But if this is missing:&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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;your app crashes.&lt;/p&gt;

&lt;p&gt;This is why frontend bugs happen so often after API updates.&lt;/p&gt;

&lt;p&gt;Very common in production.&lt;/p&gt;




&lt;h2&gt;
  
  
  First Fix: Check Before Accessing
&lt;/h2&gt;

&lt;p&gt;Safer version:&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&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="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;city&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 JavaScript checks first.&lt;/p&gt;

&lt;p&gt;No crash.&lt;/p&gt;

&lt;p&gt;Simple and safe.&lt;/p&gt;

&lt;p&gt;But this becomes messy with deeply nested objects.&lt;/p&gt;

&lt;p&gt;Example:&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;profile&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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&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;Too much code.&lt;/p&gt;

&lt;p&gt;Hard to maintain.&lt;/p&gt;




&lt;h2&gt;
  
  
  Better Fix: Optional Chaining
&lt;/h2&gt;

&lt;p&gt;Modern JavaScript gives us a much better solution:&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="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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Only continue if &lt;code&gt;address&lt;/code&gt; exists.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If it does not exist, JavaScript returns &lt;code&gt;undefined&lt;/code&gt; instead of crashing.&lt;/p&gt;

&lt;p&gt;Much cleaner.&lt;/p&gt;

&lt;p&gt;Much better.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real API Example with Optional Chaining
&lt;/h2&gt;

&lt;p&gt;Instead of 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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;profile&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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&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;Write 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="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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Short.&lt;/p&gt;

&lt;p&gt;Readable.&lt;/p&gt;

&lt;p&gt;Production-friendly.&lt;/p&gt;

&lt;p&gt;This is the preferred modern solution.&lt;/p&gt;




&lt;h2&gt;
  
  
  Another Useful Fix: Default Values
&lt;/h2&gt;

&lt;p&gt;Sometimes you want a fallback value.&lt;/p&gt;

&lt;p&gt;Example:&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="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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;City not available&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;h3&gt;
  
  
  Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;City&lt;/span&gt; &lt;span class="nx"&gt;not&lt;/span&gt; &lt;span class="nx"&gt;available&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Very useful for UI rendering.&lt;/p&gt;

&lt;p&gt;Especially in React apps.&lt;/p&gt;

&lt;p&gt;Users should see fallback text—not app crashes.&lt;/p&gt;




&lt;h2&gt;
  
  
  React Version of This Problem
&lt;/h2&gt;

&lt;p&gt;This error happens constantly in React:&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;user.profile&lt;/code&gt; is missing, the component crashes.&lt;/p&gt;

&lt;p&gt;Safer version:&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Much safer.&lt;/p&gt;

&lt;p&gt;Cleaner code.&lt;/p&gt;

&lt;p&gt;Less production stress.&lt;/p&gt;

&lt;p&gt;React developers use this daily.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hidden Cause: Async Data Loading
&lt;/h2&gt;

&lt;p&gt;Another common reason:&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="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;users&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="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the API has not loaded yet:&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="nx"&gt;users&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is &lt;code&gt;undefined&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Crash again.&lt;/p&gt;

&lt;p&gt;Safer version:&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="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;users&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="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Always protect async-loaded data.&lt;/p&gt;

&lt;p&gt;Very important.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Debug Rule
&lt;/h2&gt;

&lt;p&gt;Whenever you see:&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="nx"&gt;Cannot&lt;/span&gt; &lt;span class="nx"&gt;read&lt;/span&gt; &lt;span class="nx"&gt;properties&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;blockquote&gt;
&lt;p&gt;Which value is actually undefined?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not the final property.&lt;/p&gt;

&lt;p&gt;The missing step before it.&lt;/p&gt;

&lt;p&gt;That is where the real bug lives.&lt;/p&gt;

&lt;p&gt;This saves hours.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This error is not random.&lt;/p&gt;

&lt;p&gt;It happens because JavaScript reaches &lt;code&gt;undefined&lt;/code&gt; before reaching the property you want.&lt;/p&gt;

&lt;p&gt;Remember:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check before accessing&lt;/li&gt;
&lt;li&gt;Use optional chaining &lt;code&gt;?.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add fallback values when needed&lt;/li&gt;
&lt;li&gt;Protect API responses&lt;/li&gt;
&lt;li&gt;Protect React rendering&lt;/li&gt;
&lt;li&gt;Protect async-loaded data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mastering this one error removes a huge amount of frontend bugs.&lt;/p&gt;

&lt;p&gt;Probably more than any other JavaScript fix.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your Turn
&lt;/h2&gt;

&lt;p&gt;What was your worst “Cannot read properties of undefined” bug?&lt;/p&gt;

&lt;p&gt;Most developers remember that painful day very clearly.&lt;/p&gt;

&lt;p&gt;Peace,&lt;br&gt;
Emily &lt;a href="https://www.theidioms.com" rel="noopener noreferrer"&gt;Idioms&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why JavaScript forEach() Does Not Work with await (How to Fix It)</title>
      <dc:creator>Emily Scott</dc:creator>
      <pubDate>Mon, 20 Apr 2026 12:24:45 +0000</pubDate>
      <link>https://dev.to/idioms/why-javascript-foreach-does-not-work-with-await-how-to-fix-it-3idj</link>
      <guid>https://dev.to/idioms/why-javascript-foreach-does-not-work-with-await-how-to-fix-it-3idj</guid>
      <description>&lt;p&gt;&lt;strong&gt;Why JavaScript &lt;code&gt;forEach()&lt;/code&gt; Does Not Work with &lt;code&gt;await&lt;/code&gt; (And How to Fix It)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the most confusing async problems in JavaScript happens when developers use &lt;code&gt;await&lt;/code&gt; inside &lt;code&gt;forEach()&lt;/code&gt; and expect everything to run in order.&lt;/p&gt;

&lt;p&gt;It looks correct.&lt;/p&gt;

&lt;p&gt;It feels correct.&lt;/p&gt;

&lt;p&gt;But it breaks in production.&lt;/p&gt;

&lt;p&gt;This issue appears often in API requests, database operations, email sending, payment processing, and file uploads.&lt;/p&gt;

&lt;p&gt;Many developers lose hours debugging this.&lt;/p&gt;

&lt;p&gt;Let’s fix it properly.&lt;/p&gt;




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

&lt;p&gt;Suppose you want to process users one by one.&lt;/p&gt;

&lt;p&gt;You write 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;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Emma&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Michael&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&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="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&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="s2"&gt;`Email sent to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;All emails processed&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;At first glance, this looks perfect.&lt;/p&gt;

&lt;p&gt;You expect:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Send email to John&lt;/li&gt;
&lt;li&gt;Send email to Emma&lt;/li&gt;
&lt;li&gt;Send email to Michael&lt;/li&gt;
&lt;li&gt;Print final message&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Expected output:&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="nx"&gt;Email&lt;/span&gt; &lt;span class="nx"&gt;sent&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;John&lt;/span&gt;
&lt;span class="nx"&gt;Email&lt;/span&gt; &lt;span class="nx"&gt;sent&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;Emma&lt;/span&gt;
&lt;span class="nx"&gt;Email&lt;/span&gt; &lt;span class="nx"&gt;sent&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;Michael&lt;/span&gt;
&lt;span class="nx"&gt;All&lt;/span&gt; &lt;span class="nx"&gt;emails&lt;/span&gt; &lt;span class="nx"&gt;processed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the actual output is often:&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="nx"&gt;All&lt;/span&gt; &lt;span class="nx"&gt;emails&lt;/span&gt; &lt;span class="nx"&gt;processed&lt;/span&gt;
&lt;span class="nx"&gt;Email&lt;/span&gt; &lt;span class="nx"&gt;sent&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;John&lt;/span&gt;
&lt;span class="nx"&gt;Email&lt;/span&gt; &lt;span class="nx"&gt;sent&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;Emma&lt;/span&gt;
&lt;span class="nx"&gt;Email&lt;/span&gt; &lt;span class="nx"&gt;sent&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;Michael&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sometimes even worse—execution becomes unpredictable.&lt;/p&gt;

&lt;p&gt;Very frustrating.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Happens
&lt;/h2&gt;

&lt;p&gt;The problem is simple:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;forEach()&lt;/code&gt; does not wait for &lt;code&gt;async/await&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It completely ignores Promises.&lt;/p&gt;

&lt;p&gt;Even if you write &lt;code&gt;await&lt;/code&gt; inside it, &lt;code&gt;forEach()&lt;/code&gt; itself does not pause.&lt;/p&gt;

&lt;p&gt;It immediately starts all iterations and moves on.&lt;/p&gt;

&lt;p&gt;That means this line:&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="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;All emails processed&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;runs before the async work finishes.&lt;/p&gt;

&lt;p&gt;This creates race conditions and broken logic.&lt;/p&gt;

&lt;p&gt;Especially dangerous in production systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Understanding the Core Issue
&lt;/h2&gt;

&lt;p&gt;Let’s simplify it.&lt;/p&gt;

&lt;p&gt;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="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&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="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&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;does NOT mean:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Wait for each task one by one”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It actually means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Start everything immediately and do not wait”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the real problem.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;forEach()&lt;/code&gt; was designed for synchronous operations—not async control flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrong Real-World Example
&lt;/h2&gt;

&lt;p&gt;Imagine payment processing:&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="nx"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&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="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;chargeCustomer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;closeDailyReport&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Danger:&lt;/p&gt;

&lt;p&gt;The report may close before payments finish.&lt;/p&gt;

&lt;p&gt;That can create serious business problems.&lt;/p&gt;

&lt;p&gt;This is not a small bug.&lt;/p&gt;

&lt;p&gt;It can affect money.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Correct Fix: Use &lt;code&gt;for...of&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The safest solution is &lt;code&gt;for...of&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;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;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Emma&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Michael&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;processUsers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&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="s2"&gt;`Email sent to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;All emails processed&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="nf"&gt;processUsers&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now JavaScript waits properly.&lt;/p&gt;

&lt;p&gt;Output:&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="nx"&gt;Email&lt;/span&gt; &lt;span class="nx"&gt;sent&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;John&lt;/span&gt;
&lt;span class="nx"&gt;Email&lt;/span&gt; &lt;span class="nx"&gt;sent&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;Emma&lt;/span&gt;
&lt;span class="nx"&gt;Email&lt;/span&gt; &lt;span class="nx"&gt;sent&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;Michael&lt;/span&gt;
&lt;span class="nx"&gt;All&lt;/span&gt; &lt;span class="nx"&gt;emails&lt;/span&gt; &lt;span class="nx"&gt;processed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perfect.&lt;/p&gt;

&lt;p&gt;Predictable.&lt;/p&gt;

&lt;p&gt;Safe.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why &lt;code&gt;for...of&lt;/code&gt; Works
&lt;/h2&gt;

&lt;p&gt;Because &lt;code&gt;for...of&lt;/code&gt; respects &lt;code&gt;await&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Each loop waits for the previous one to finish.&lt;/p&gt;

&lt;p&gt;This is called sequential execution.&lt;/p&gt;

&lt;p&gt;Very useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Payment processing&lt;/li&gt;
&lt;li&gt;Database writes&lt;/li&gt;
&lt;li&gt;Email sending&lt;/li&gt;
&lt;li&gt;File uploads&lt;/li&gt;
&lt;li&gt;Rate-limited APIs&lt;/li&gt;
&lt;li&gt;Authentication flows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anywhere order matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  What If You Want Parallel Execution?
&lt;/h2&gt;

&lt;p&gt;Sometimes you do want everything to run together.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetching multiple products&lt;/li&gt;
&lt;li&gt;Loading dashboard widgets&lt;/li&gt;
&lt;li&gt;Getting multiple API responses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In that case, use &lt;code&gt;Promise.all()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Example:&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;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Emma&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Michael&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;await&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;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&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="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&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="s2"&gt;`Email sent to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;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;All emails processed&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;This runs tasks in parallel—but still waits for all of them to finish.&lt;/p&gt;

&lt;p&gt;Very powerful.&lt;/p&gt;




&lt;h2&gt;
  
  
  Rule to Remember
&lt;/h2&gt;

&lt;p&gt;Use this simple rule:&lt;/p&gt;

&lt;h3&gt;
  
  
  Need order?
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;for...of&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Need speed?
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;Promise.all()&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Never use?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;forEach()&lt;/code&gt; with &lt;code&gt;await&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This rule saves a lot of debugging time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Another Common Mistake
&lt;/h2&gt;

&lt;p&gt;Developers often write 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="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&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="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&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;This still does NOT work.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because &lt;code&gt;forEach()&lt;/code&gt; returns &lt;code&gt;undefined&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There is nothing real for &lt;code&gt;await&lt;/code&gt; to wait for.&lt;/p&gt;

&lt;p&gt;So even this fails.&lt;/p&gt;

&lt;p&gt;Very common mistake.&lt;/p&gt;




&lt;h2&gt;
  
  
  Debugging Question
&lt;/h2&gt;

&lt;p&gt;Whenever async loops behave strangely, ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Am I awaiting the loop… or only the function inside it?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question reveals the bug fast.&lt;/p&gt;

&lt;p&gt;Most developers miss this.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;forEach()&lt;/code&gt; is excellent for simple synchronous loops.&lt;/p&gt;

&lt;p&gt;But for async workflows, it becomes dangerous.&lt;/p&gt;

&lt;p&gt;Remember:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;forEach()&lt;/code&gt; ignores &lt;code&gt;await&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;for...of&lt;/code&gt; handles sequence safely&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Promise.all()&lt;/code&gt; handles parallel work properly&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;await forEach()&lt;/code&gt; is still wrong&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding this makes JavaScript async code much cleaner.&lt;/p&gt;

&lt;p&gt;And production bugs become much easier to prevent.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your Turn
&lt;/h2&gt;

&lt;p&gt;Have you ever used &lt;code&gt;await&lt;/code&gt; inside &lt;code&gt;forEach()&lt;/code&gt; and spent hours debugging it?&lt;/p&gt;

&lt;p&gt;Almost every JavaScript developer has.&lt;/p&gt;

&lt;p&gt;Peace,&lt;br&gt;
Emily &lt;a href="https://www.theidioms.com" rel="noopener noreferrer"&gt;Idioms&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why map() Is Returning undefined in JavaScript (And How to Fix It)</title>
      <dc:creator>Emily Scott</dc:creator>
      <pubDate>Sun, 19 Apr 2026 07:34:49 +0000</pubDate>
      <link>https://dev.to/idioms/why-map-is-returning-undefined-in-javascript-and-how-to-fix-it-3pda</link>
      <guid>https://dev.to/idioms/why-map-is-returning-undefined-in-javascript-and-how-to-fix-it-3pda</guid>
      <description>&lt;p&gt;One of the most common JavaScript bugs developers face is using &lt;code&gt;.map()&lt;/code&gt; and getting an array full of &lt;code&gt;undefined&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It looks simple, but this issue wastes hours during debugging—especially in React projects, API handling, and frontend rendering.&lt;/p&gt;

&lt;p&gt;Let’s fix it properly.&lt;/p&gt;




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

&lt;p&gt;You write code 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;const&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doubled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;num&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;num&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&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="nx"&gt;doubled&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Expected Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Actual Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Very frustrating.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Happens
&lt;/h2&gt;

&lt;p&gt;When you use curly braces &lt;code&gt;{}&lt;/code&gt; inside &lt;code&gt;.map()&lt;/code&gt;, JavaScript expects an explicit &lt;code&gt;return&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This code:&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="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&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;num&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&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;does not return anything.&lt;/p&gt;

&lt;p&gt;And if nothing is returned, JavaScript automatically returns &lt;code&gt;undefined&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That is why every item becomes &lt;code&gt;undefined&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Correct Fix
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Option 1: Add &lt;code&gt;return&lt;/code&gt;
&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;const&lt;/span&gt; &lt;span class="nx"&gt;doubled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;num&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&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;
  
  
  Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Option 2: Use Implicit Return
&lt;/h2&gt;

&lt;p&gt;Cleaner version:&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;const&lt;/span&gt; &lt;span class="nx"&gt;doubled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is shorter and commonly preferred.&lt;/p&gt;




&lt;h2&gt;
  
  
  The React Version of This Bug
&lt;/h2&gt;

&lt;p&gt;This happens constantly in React:&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="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing renders.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because JSX also needs &lt;code&gt;return&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Correct Version
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&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="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or:&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="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is one of the most common frontend mistakes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Another Hidden Trap
&lt;/h2&gt;

&lt;p&gt;Returning objects also causes confusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrong
&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;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&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;JavaScript thinks this is a function block, not an object.&lt;/p&gt;

&lt;h2&gt;
  
  
  Correct
&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;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wrap the object in parentheses.&lt;/p&gt;

&lt;p&gt;Very important.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Debug Rule
&lt;/h2&gt;

&lt;p&gt;If &lt;code&gt;.map()&lt;/code&gt; gives &lt;code&gt;undefined&lt;/code&gt;, ask yourself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Did I actually return something?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question usually finds the bug immediately.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;.map()&lt;/code&gt; is powerful, but tiny syntax mistakes create major confusion.&lt;/p&gt;

&lt;p&gt;Remember:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Curly braces need &lt;code&gt;return&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Parentheses allow implicit return&lt;/li&gt;
&lt;li&gt;Objects need wrapping &lt;code&gt;()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;React JSX must also return&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mastering this saves serious debugging time—especially in production apps.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your Turn
&lt;/h2&gt;

&lt;p&gt;What was your worst &lt;code&gt;.map()&lt;/code&gt; debugging moment?&lt;/p&gt;

&lt;p&gt;React developers usually have many.&lt;/p&gt;

&lt;p&gt;Peace,&lt;br&gt;
Emily &lt;a href="https://www.theidioms.com" rel="noopener noreferrer"&gt;Idioms&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Why Your JavaScript setTimeout() Is Not Working as Expected (And How to Fix It)</title>
      <dc:creator>Emily Scott</dc:creator>
      <pubDate>Sat, 18 Apr 2026 10:54:58 +0000</pubDate>
      <link>https://dev.to/idioms/why-your-javascript-settimeout-is-not-working-as-expected-and-how-to-fix-it-dok</link>
      <guid>https://dev.to/idioms/why-your-javascript-settimeout-is-not-working-as-expected-and-how-to-fix-it-dok</guid>
      <description>&lt;p&gt;One of the most common frustrations for JavaScript developers—especially beginners and even experienced devs during debugging—is when &lt;code&gt;setTimeout()&lt;/code&gt; behaves differently than expected.&lt;/p&gt;

&lt;p&gt;You write a delay, expect the code to wait, but JavaScript seems to ignore your logic.&lt;/p&gt;

&lt;p&gt;Let’s fix that.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Problem
&lt;/h1&gt;

&lt;p&gt;Many developers think &lt;code&gt;setTimeout()&lt;/code&gt; pauses JavaScript execution.&lt;/p&gt;

&lt;p&gt;Example:&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="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;Delayed Message&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;2000&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;Expected output by many:&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="nx"&gt;Start&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wait&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="nx"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;Delayed&lt;/span&gt; &lt;span class="nx"&gt;Message&lt;/span&gt;
&lt;span class="nx"&gt;End&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Actual output:&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="nx"&gt;Start&lt;/span&gt;
&lt;span class="nx"&gt;End&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wait&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="nx"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;Delayed&lt;/span&gt; &lt;span class="nx"&gt;Message&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This confuses a lot of developers.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why This Happens
&lt;/h1&gt;

&lt;p&gt;JavaScript is &lt;strong&gt;single-threaded&lt;/strong&gt;, which means it executes one task at a time.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;setTimeout()&lt;/code&gt; does not pause execution.&lt;/p&gt;

&lt;p&gt;Instead, it tells the browser:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Run this function after at least 2 seconds.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The callback is sent to the &lt;strong&gt;Event Loop&lt;/strong&gt;, and JavaScript continues running the next lines immediately.&lt;/p&gt;

&lt;p&gt;That is why &lt;code&gt;"End"&lt;/code&gt; appears before &lt;code&gt;"Delayed Message"&lt;/code&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Real Issue in Production
&lt;/h1&gt;

&lt;p&gt;This creates bigger problems when working with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API requests&lt;/li&gt;
&lt;li&gt;Form validation&lt;/li&gt;
&lt;li&gt;DOM updates&lt;/li&gt;
&lt;li&gt;Authentication flows&lt;/li&gt;
&lt;li&gt;Payment gateways&lt;/li&gt;
&lt;li&gt;Loading states&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Developers often expect delayed code to execute in order, but async behavior breaks logic.&lt;/p&gt;

&lt;p&gt;Example:&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;userData&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;userData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&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="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;userData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&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="kc"&gt;undefined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because &lt;code&gt;console.log()&lt;/code&gt; runs before the timeout finishes.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Correct Fix
&lt;/h1&gt;

&lt;p&gt;Use callbacks, Promises, or &lt;code&gt;async/await&lt;/code&gt; depending on the situation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Better Example Using Promise
&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;function&lt;/span&gt; &lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;run&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;Start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2000&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;Now it waits properly&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="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&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="nx"&gt;Start&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wait&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="nx"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;Now&lt;/span&gt; &lt;span class="nx"&gt;it&lt;/span&gt; &lt;span class="nx"&gt;waits&lt;/span&gt; &lt;span class="nx"&gt;properly&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you predictable execution flow.&lt;/p&gt;




&lt;h1&gt;
  
  
  Pro Tip for Real Projects
&lt;/h1&gt;

&lt;p&gt;Avoid using &lt;code&gt;setTimeout()&lt;/code&gt; just to “wait for something.”&lt;/p&gt;

&lt;p&gt;Bad practice:&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="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="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Good practice:&lt;/p&gt;

&lt;p&gt;Use actual event completion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Promise resolved&lt;/li&gt;
&lt;li&gt;API response returned&lt;/li&gt;
&lt;li&gt;DOM fully loaded&lt;/li&gt;
&lt;li&gt;User action completed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Time-based guessing creates bugs.&lt;/p&gt;




&lt;h1&gt;
  
  
  Debugging Tip
&lt;/h1&gt;

&lt;p&gt;When debugging async issues, ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Am I waiting for time… or waiting for an actual result?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question solves many hidden JavaScript bugs.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;setTimeout()&lt;/code&gt; is not broken.&lt;/p&gt;

&lt;p&gt;The misunderstanding is usually about how JavaScript handles async execution.&lt;/p&gt;

&lt;p&gt;Once you understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Call Stack&lt;/li&gt;
&lt;li&gt;Web APIs&lt;/li&gt;
&lt;li&gt;Callback Queue&lt;/li&gt;
&lt;li&gt;Event Loop&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JavaScript becomes far easier to control.&lt;/p&gt;

&lt;p&gt;And debugging becomes much less painful.&lt;/p&gt;




&lt;h1&gt;
  
  
  Have You Faced This?
&lt;/h1&gt;

&lt;p&gt;What was your most confusing &lt;code&gt;setTimeout()&lt;/code&gt; bug?&lt;/p&gt;

&lt;p&gt;Drop it in the comments—every developer has at least one painful story. Peace &lt;a href="https://www.theidioms.com" rel="noopener noreferrer"&gt;Idioms&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>How I Built a Random Post Feed in WordPress Without Using RSS</title>
      <dc:creator>Emily Scott</dc:creator>
      <pubDate>Sun, 12 Apr 2026 06:51:11 +0000</pubDate>
      <link>https://dev.to/idioms/how-i-built-a-random-post-feed-in-wordpress-without-using-rss-1h7e</link>
      <guid>https://dev.to/idioms/how-i-built-a-random-post-feed-in-wordpress-without-using-rss-1h7e</guid>
      <description>&lt;p&gt;When I started working on my website, &lt;em&gt;theidioms.com&lt;/em&gt;, I wanted visitors to discover different content every time they visited.&lt;/p&gt;

&lt;p&gt;The problem was simple: the default WordPress RSS feed always showed the latest posts in date order.&lt;/p&gt;

&lt;p&gt;That was not ideal for a content-heavy website with hundreds of evergreen articles.&lt;/p&gt;

&lt;p&gt;Older idiom posts were getting buried, even though they were still highly useful.&lt;/p&gt;

&lt;p&gt;So I decided to build a custom solution.&lt;/p&gt;




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

&lt;p&gt;WordPress RSS feeds are mainly designed for &lt;strong&gt;recent content syndication&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;By default, they return:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the latest published posts&lt;/li&gt;
&lt;li&gt;chronological ordering&lt;/li&gt;
&lt;li&gt;very limited control over randomization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For my use case, this created a discovery problem.&lt;/p&gt;

&lt;p&gt;Visitors kept seeing only the newest articles, while older evergreen posts remained hidden.&lt;/p&gt;

&lt;p&gt;For a website focused on idioms and phrases, this meant many useful pages were rarely seen.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Solution
&lt;/h2&gt;

&lt;p&gt;Instead of relying on the RSS feed, I used a custom &lt;code&gt;WP_Query&lt;/code&gt; to fetch a random published post directly from the database.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;'post_type'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'post'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'post_status'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'publish'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'posts_per_page'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'orderby'&lt;/span&gt;        &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'rand'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WP_Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;have_posts&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;have_posts&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;the_post&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;a href="'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;get_permalink&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'"&amp;gt;'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;get_the_title&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;/a&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;endwhile&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;endif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;wp_reset_postdata&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This returns one random published post every time the page loads.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Helped
&lt;/h2&gt;

&lt;p&gt;This small change solved several issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better Content Discovery
&lt;/h3&gt;

&lt;p&gt;Visitors now land on different idiom pages instead of repeatedly seeing the latest articles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Increased Engagement
&lt;/h3&gt;

&lt;p&gt;Random internal links encourage users to continue exploring.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better Use of Evergreen Content
&lt;/h3&gt;

&lt;p&gt;Older articles get fresh visibility without needing to republish them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance Challenge
&lt;/h2&gt;

&lt;p&gt;One issue I quickly noticed was that &lt;code&gt;orderby =&amp;gt; 'rand'&lt;/code&gt; can become slow on larger sites.&lt;/p&gt;

&lt;p&gt;As the database grows, random queries may increase server load.&lt;/p&gt;

&lt;p&gt;To solve this, I later cached the result and refreshed it every 15 minutes.&lt;/p&gt;

&lt;p&gt;That gave me the benefit of random discovery without stressing the database on every page request.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Sometimes the default WordPress tools are not enough for specific use cases.&lt;/p&gt;

&lt;p&gt;For my site, replacing RSS with a custom random query improved both user experience and page visibility.&lt;/p&gt;

&lt;p&gt;If you run a blog, dictionary site, or any content archive with evergreen posts, this is a simple technique worth trying.&lt;/p&gt;

&lt;p&gt;Have you built a similar custom solution in WordPress? Let me know in the comments.&lt;/p&gt;

&lt;p&gt;Cheers! &lt;a href="https://www.theidioms.com" rel="noopener noreferrer"&gt;Idioms&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>wordpress</category>
      <category>php</category>
      <category>rss</category>
    </item>
    <item>
      <title>How to Fix “Blocked by CORS Policy” Error in JavaScript (Step-by-Step Guide)</title>
      <dc:creator>Emily Scott</dc:creator>
      <pubDate>Sat, 21 Feb 2026 04:34:20 +0000</pubDate>
      <link>https://dev.to/idioms/how-to-fix-blocked-by-cors-policy-error-in-javascript-step-by-step-guide-48h6</link>
      <guid>https://dev.to/idioms/how-to-fix-blocked-by-cors-policy-error-in-javascript-step-by-step-guide-48h6</guid>
      <description>&lt;p&gt;How to Fix “Blocked by CORS Policy” Error in JavaScript (Step-by-Step Guide)&lt;/p&gt;

&lt;p&gt;If you are building a web application and see this error in your browser&lt;br&gt;
console:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Access to fetch at 'https://api.example.com' from origin 'http://localhost:3000' 
has been blocked by CORS policy.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This is one of the most common issues beginners face when working with&lt;br&gt;
JavaScript and APIs.&lt;/p&gt;

&lt;p&gt;In this article, you will learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  What CORS is&lt;/li&gt;
&lt;li&gt;  Why this error happens&lt;/li&gt;
&lt;li&gt;  How to fix it in Node.js (Express)&lt;/li&gt;
&lt;li&gt;  How to fix it in PHP&lt;/li&gt;
&lt;li&gt;  Best practices for production&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;What Is CORS?&lt;/p&gt;

&lt;p&gt;CORS (Cross-Origin Resource Sharing) is a browser security feature.&lt;/p&gt;

&lt;p&gt;A request is considered cross-origin when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Your frontend runs on &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Your backend runs on &lt;a href="https://api.example.com" rel="noopener noreferrer"&gt;https://api.example.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because these origins are different, the browser blocks the request&lt;br&gt;
unless the server explicitly allows it.&lt;/p&gt;

&lt;p&gt;Important: CORS is enforced by the browser, not by the server.&lt;/p&gt;




&lt;p&gt;Why the CORS Error Happens&lt;/p&gt;

&lt;p&gt;CORS errors occur because the backend server does not send the correct&lt;br&gt;
HTTP headers.&lt;/p&gt;

&lt;p&gt;The browser checks for headers like:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Access-Control-Allow-Origin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If the header is missing, the browser blocks the request.&lt;/p&gt;

&lt;p&gt;This means you cannot fix CORS from the frontend alone.&lt;br&gt;
It must be configured on the backend.&lt;/p&gt;




&lt;p&gt;Solution 1: Fix CORS in Node.js (Express)&lt;/p&gt;

&lt;p&gt;First, install the CORS middleware:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install cors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Then update your Express server:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const express = require('express');
const cors = require('cors');

const app = express();

app.use(cors());

app.get('/api/data', (req, res) =&amp;gt; {
  res.json({ message: "CORS is fixed!" });
});

app.listen(5000, () =&amp;gt; console.log("Server running on port 5000"));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Restart the server and test your request again.&lt;/p&gt;




&lt;p&gt;Solution 2: Fix CORS in PHP&lt;/p&gt;

&lt;p&gt;If you are using PHP, add the following headers at the top of your PHP&lt;br&gt;
file:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This allows cross-origin requests.&lt;/p&gt;




&lt;p&gt;Important: Do Not Use “*” in Production&lt;/p&gt;

&lt;p&gt;Using:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;header("Access-Control-Allow-Origin: *");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Allows requests from any domain.&lt;/p&gt;

&lt;p&gt;In production, it is safer to specify your domain:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;header("Access-Control-Allow-Origin: https://yourdomain.com");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;Why Postman Works But the Browser Fails&lt;/p&gt;

&lt;p&gt;You may notice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Postman works&lt;/li&gt;
&lt;li&gt;  Browser fails&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This happens because CORS is enforced only by browsers.&lt;br&gt;
Postman does not enforce CORS restrictions.&lt;/p&gt;




&lt;p&gt;Quick Debug Checklist&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Confirm CORS headers are set on the backend&lt;/li&gt;
&lt;li&gt;  Restart the server&lt;/li&gt;
&lt;li&gt;  Clear browser cache&lt;/li&gt;
&lt;li&gt;  Check the browser console again&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Conclusion&lt;/p&gt;

&lt;p&gt;The “Blocked by CORS Policy” error is not a JavaScript bug.&lt;br&gt;
It is a browser security rule.&lt;/p&gt;

&lt;p&gt;Once you understand that CORS must be configured on the backend, the&lt;br&gt;
solution becomes straightforward.&lt;/p&gt;

&lt;p&gt;Thanks for reading - &lt;a href="https://www.theidioms.com" rel="noopener noreferrer"&gt;Idioms&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>php</category>
      <category>node</category>
    </item>
    <item>
      <title>My Journey into Web Development (And Why I Started with JavaScript)</title>
      <dc:creator>Emily Scott</dc:creator>
      <pubDate>Fri, 20 Feb 2026 07:36:04 +0000</pubDate>
      <link>https://dev.to/idioms/my-journey-into-web-development-and-why-i-started-with-javascript-2p8f</link>
      <guid>https://dev.to/idioms/my-journey-into-web-development-and-why-i-started-with-javascript-2p8f</guid>
      <description>&lt;p&gt;Hi everyone, 👋&lt;/p&gt;

&lt;p&gt;I’m a beginner web developer currently learning JavaScript, HTML, CSS, and PHP, and recently exploring AI integration in web apps. I wanted my first post to share why I started — and what I’ve learned so far.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I Started Learning Web Development&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’ve always been curious about how websites actually work. Not just how they look, but how they function behind the scenes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When I discovered that:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML structures the content&lt;/li&gt;
&lt;li&gt;CSS styles the design&lt;/li&gt;
&lt;li&gt;JavaScript makes it interactive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...it suddenly felt less mysterious and more achievable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 My Current Learning Focus&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Right now, I’m focusing on:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;✅ Writing clean HTML structure&lt;/p&gt;

&lt;p&gt;✅ Building responsive layouts with CSS&lt;/p&gt;

&lt;p&gt;✅ Understanding JavaScript fundamentals (variables, functions, loops)&lt;/p&gt;

&lt;p&gt;✅ Exploring how AI APIs can connect with web apps&lt;/p&gt;

&lt;p&gt;I’m not trying to rush into advanced frameworks yet. I want strong fundamentals first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔍 Biggest Lesson So Far&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Consistency beats intensity.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It’s easy to feel overwhelmed when you see experienced developers building complex apps. But I’ve learned that small daily progress — even 30–60 minutes — adds up quickly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎯 What’s Next?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn DOM manipulation deeply&lt;/li&gt;
&lt;li&gt;Build small interactive projects&lt;/li&gt;
&lt;li&gt;Experiment with simple AI-powered features&lt;/li&gt;
&lt;li&gt;Improve my Git &amp;amp; GitHub workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're also a beginner, I’d love to connect.&lt;br&gt;
What are you currently learning?&lt;/p&gt;

&lt;p&gt;Let’s grow step by step. 🚀&lt;/p&gt;

&lt;p&gt;Cheers! &lt;a href="https://www.theidioms.com" rel="noopener noreferrer"&gt;Idioms&lt;/a&gt;&lt;/p&gt;

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