Skip to main content

Command Palette

Search for a command to run...

Synchronous vs Asynchronous JavaScript

Updated
5 min read
Synchronous vs Asynchronous JavaScript

Understanding Blocking and Non-Blocking Code

JavaScript can run code in two different ways:

  • Synchronous

  • Asynchronous

If you understand this topic well, then concepts like:

  • callbacks

  • promises

  • async/await

  • event loop

become much easier.

This is one of the most important foundations in JavaScript.


What Synchronous Code Means

Synchronous code runs line by line, one step at a time.

JavaScript waits for the current line to finish before moving to the next line.

In simple words:

One task must complete before the next task starts.

Example of Synchronous Code

console.log("Start");
console.log("Middle");
console.log("End");

Output:


Start
Middle
End

Why?

Because JavaScript executes it in order, from top to bottom.


Real-Life Analogy for Synchronous Code

Imagine you’re standing in a queue at a bank:

  • Person 1 finishes

  • Then Person 2 starts

  • Then Person 3 starts

Nobody can skip ahead.

✅ This is blocking, step-by-step execution.


What Asynchronous Code Means

Asynchronous code allows JavaScript to start a task now and finish it later, without stopping the rest of the program.

In simple words:

JavaScript can continue doing other work while waiting for slow tasks to finish.

These slow tasks can be:

  • API calls

  • Timers (setTimeout)

  • File reading

  • Database requests

  • User actions (clicks, input)


Example of Asynchronous Code:-

console.log("Start");

setTimeout(() => {
  console.log("Inside Timer");
}, 2000);

console.log("End");

output:

Start
End
Inside Timer

Why?

Because:

  • setTimeout starts a timer

  • JavaScript does not wait for 2 seconds

  • It moves on to the next line

  • After 2 seconds, the callback runs later

✅ This is non-blocking behavior


Why JavaScript Needs Asynchronous Behavior

JavaScript is single-threaded.

That means:

It can do one main task at a time on the call stack.

So if JavaScript waited for every slow operation to finish, the whole application would freeze.

Imagine if your app had to wait for:

  • a server response

  • a file read

  • a database request

  • a 5-second timer

…and nothing else could happen during that time

That would be a terrible user experience.


Example: Why Async is Important

Imagine a website that fetches user data from a server.

If JavaScript handled it synchronously:

  • the page could freeze

  • buttons might stop responding

  • the UI would feel broken

With asynchronous behavior:

  • JavaScript sends the request

  • continues running other code

  • handles the response when it arrives

This is why async behavior is essential in real-world apps.


Problems That Occur With Blocking Code

Blocking code means JavaScript is stuck on one task and cannot continue until it finishes.

This creates problems like:

  • frozen UI

  • delayed user interactions

  • poor performance

  • bad user experience

  • unresponsive apps


Blocking Example (Conceptual)

console.log("Start");

// Imagine this takes 5 seconds
longRunningTask();

console.log("End");

What happens?

  • "Start" prints

  • JavaScript waits for longRunningTask()

  • Nothing else can run during that time

  • "End" prints only after the task finishes

This is blocking behavior


Blocking vs Non-Blocking Code


Blocking (Synchronous):

console.log("1");
heavyTask(); // takes time
console.log("2");

Flow:

  • 1

  • wait...

  • 2


Non-Blocking (Asynchronous)


console.log("1");

setTimeout(() => {
  console.log("2");
}, 2000);

console.log("3");

Flow:

  • 1

  • 3

  • 2


Everyday Analogy: Waiting for Food

Synchronous style:

You order food and stand at the counter doing nothing until it’s ready.

  • Order food

  • Wait

  • Receive food

  • Then do something else

❌ Waste of time


Asynchronous style:

You order food, take a seat, talk to your friend, and when food is ready, you pick it up.

  • Order food

  • Do other things

  • Food becomes ready

  • Handle it later

✅ Efficient and practical

This is exactly how async JavaScript works.


Simple Step-by-Step Execution Example


Synchronous Example:-

console.log("Task 1");
console.log("Task 2");
console.log("Task 3");

Execution:

Task 1 → Task 2 → Task 3

Everything runs in exact order.


Asynchronous Example:

console.log("Task 1");

setTimeout(() => {
  console.log("Task 2");
}, 1000);

console.log("Task 3");

Execution:

Task 1 → Task 3 → Task 2

Because Task 2 is scheduled for later.


How Asynchronous JavaScript Works (High-Level)

Even though JavaScript is single-threaded, the browser / runtime helps by using:

  • Call Stack

  • Web APIs / Browser APIs

  • Callback Queue / Task Queue

  • Event Loop


High-Level Flow

  1. JavaScript runs code on the Call Stack

  2. Slow tasks like setTimeout are handed to Web APIs

  3. When ready, their callback moves to the Task Queue

  4. The Event Loop checks if the Call Stack is empty

  5. If empty, it pushes the callback to the stack

👉 This is what makes async behavior possible.


Synchronous vs Asynchronous (Quick Comparison)

Feature Synchronous Asynchronous
Execution style Step-by-step Can continue other work
Blocking? Yes Usually non-blocking
Waits for slow tasks? Yes No
Good for Simple immediate tasks Timers, APIs, I/O
User experience Can freeze if slow More responsive