Skip to main content

Synchronous vs Asynchronous

Sync = blocking, Async = non-blocking


Synchronous Code​

"One thing at a time, blocking"

Synchronous code executes line by line, blocking until each operation completes.

"Synchronous code executes sequentially, blocking execution until each operation completes before moving to the next."


Synchronous Example​

Sequential execution

console.log("1");
console.log("2");
console.log("3");
// Output: 1, 2, 3 (in order)

Each line waits for the previous to finish.

"Synchronous code executes in order, with each line waiting for the previous to complete."


Asynchronous Code​

"Non-blocking, continues execution"

Asynchronous code doesn't block execution - it starts an operation and continues while waiting.

"Asynchronous code starts operations and continues execution without waiting, handling results later."


Asynchronous Example​

Non-blocking execution

console.log("1");
setTimeout(() => console.log("2"), 100);
console.log("3");
// Output: 1, 3, 2 (2 comes later)

The setTimeout doesn't block - execution continues.

"Asynchronous operations like setTimeout don't block - the code continues and handles the result later."


Why Asynchronous?​

Performance · User experience

  • Non-blocking: UI stays responsive
  • Efficiency: Can handle multiple operations
  • Better UX: No freezing during I/O

"Asynchronous code keeps the UI responsive and allows handling multiple operations efficiently."


Async Operations​

Network · Timers · File I/O

Common async operations:

  • Network requests: fetch, XMLHttpRequest
  • Timers: setTimeout, setInterval
  • File operations: Reading/writing files
  • Database queries: Async database calls

"Network requests, timers, file I/O, and database queries are typically asynchronous operations."


Callbacks​

Functions called when async completes

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

The arrow function is a callback.

"Callbacks are functions passed to async operations to handle results when they complete."


Promises​

Better async handling

fetch("/api/data")
.then((response) => response.json())
.then((data) => console.log(data))
.catch((error) => console.error(error));

"Promises provide better async handling with then/catch instead of nested callbacks."


Async/Await​

Synchronous-looking async code

async function fetchData() {
try {
const response = await fetch("/api/data");
const data = await response.json();
return data;
} catch (error) {
console.error(error);
}
}

"Async/await provides cleaner syntax for promises, making async code look synchronous."


Event Loop​

Enables async in single-threaded JS

JavaScript is single-threaded but uses the event loop to handle async operations:

  • Call stack for sync code
  • Callback queue for async callbacks
  • Event loop moves callbacks to stack

"The event loop enables asynchronous behavior in JavaScript's single-threaded environment by managing the call stack and callback queue."


"Synchronous code executes sequentially and blocks until each operation completes. Asynchronous code is non-blocking and continues execution while operations complete. JavaScript uses callbacks, promises, and async/await for async operations. The event loop enables async behavior in single-threaded JavaScript by managing the call stack and callback queue."


🧠 Ultra-Short Cheat Sheet​

Sync = blocking, sequential
Async = non-blocking
Callbacks
Promises
Async/await
Event loop
Network, timers, I/O = async