Asynchronous JavaScript: Keep Your UI Alive

JavaScript is single-threaded. If your code waits and freezes, your UI dies.
“Wait for data — but never freeze the user.”

🕰️ Sync vs Async

⏳ Synchronous

Runs line by line. No patience.

JavaScript

console.log("A");
console.log("B");
console.log("C");
          

Output: A → B → C

⚡ Asynchronous

Waits without blocking.

JavaScript

console.log("A");

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

console.log("C");
          

Output: A → C → B

📞 Callback

A callback is a function called later.

JavaScript

function loadData(callback) {
  setTimeout(() => {
    callback("Data loaded");
  }, 2000);
}

loadData((result) => {
  console.log(result);
});
          

Works — but too many callbacks lead to callback hell.

🤝 Promise

A promise represents a value that will exist later.

  • pending
  • fulfilled
  • rejected
JavaScript

const getData = new Promise((resolve, reject) => {
  let success = true;

  if (success) {
    resolve("Data loaded");
  } else {
    reject("Failed to load data");
  }
});

getData
  .then(result => console.log(result))
  .catch(error => console.log(error));
          

Cleaner than callbacks. Still readable.

🚀 async / await

Looks synchronous. Works asynchronously.

JavaScript

async function fetchData() {
  try {
    const result = await getData;
    console.log(result);
  } catch (error) {
    console.log(error);
  }
}
          

This is the modern standard.

🌐 Fetch API

Fetch is how JavaScript talks to the internet.

JavaScript

fetch("https://api.example.com/data")
  .then(res => res.json())
  .then(data => console.log(data))
  .catch(err => console.log(err));
          

Cleaner with async/await:

JavaScript

async function getData() {
  const res = await fetch("https://api.example.com/data");
  const data = await res.json();
  console.log(data);
}
          

💬 Mini Project — Quote Generator

JavaScript

async function getQuote() {
  const res = await fetch("https://api.quotable.io/random");
  const data = await res.json();

  console.log(data.content);
}
          

🧑 Mini Project — Random User

JavaScript

async function getUser() {
  const res = await fetch("https://randomuser.me/api/");
  const data = await res.json();

  const user = data.results[0];
  console.log(user.name.first, user.email);
}
          

🪪 Mini Project — Display User Card

JavaScript

async function showUser() {
  const res = await fetch("https://randomuser.me/api/");
  const data = await res.json();
  const user = data.results[0];

  const card = document.querySelector(".card");
  card.innerHTML = `
    
    

${user.name.first} ${user.name.last}

${user.email}

`; }

JS + DOM + API = full front-end combo.

🔥 Mini Challenges

  • Add loading text & error handling
  • Button to refetch data
  • Filter user by gender and display it

📌 Key Takeaways

  • Async keeps the UI responsive
  • Callbacks → Promises → async/await
  • Fetch API connects your app to the world
  • Error handling is not optional
  • Data + DOM = real applications