Skip to content
AJAX — Complete Asynchronous JavaScript & API Communication Guide

AJAX — Complete Asynchronous JavaScript & API Communication Guide

DodaTech Updated Jun 6, 2026 6 min read

AJAX (Asynchronous JavaScript and XML) is a technique for sending and receiving data from a server without reloading the page — the foundation of modern single-page applications and dynamic web experiences.

What You’ll Learn

How AJAX works under the hood, use the XMLHttpRequest object and the modern Fetch API, handle JSON and XML responses, manage CORS and cross-origin requests, implement error handling, and build async data flows with async/await.

Why AJAX Matters

Without AJAX, every data fetch would require a full page reload — like reading a book where you must close and reopen it for each page. AJAX powers every modern web feature: auto-saving forms, infinite scroll, live search, real-time notifications, and API-driven dashboards. DodaTech’s Doda Browser uses AJAX requests to fetch page metadata, scan results, and security ratings without interrupting your browsing session.

    graph LR
  A[JavaScript Fundamentals] --> B[HTTP Basics]
  B --> C[XMLHttpRequest]
  C --> D[Fetch API]
  D --> E[Async/Await]
  E --> F[CORS & Security]
  F --> G[Real-World API Clients]
  style C fill:#4f46e5,color:#fff
  
Prerequisites: Working JavaScript skills (functions, objects, callbacks). Understanding HTTP methods (GET, POST) and status codes is helpful.

Core Concepts Explained

Think of AJAX like ordering takeout by phone. You dial the restaurant (send a request), wait while they prepare the food (server processes your request), and they deliver it to your door (send back a response). Meanwhile, you continue watching TV — you don’t have to stand by the phone. That’s the “asynchronous” part: your page keeps working while waiting for the server.

XMLHttpRequest (The Classic Way)

const xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/users", true);
xhr.setRequestHeader("Content-Type", "application/json");

XMLHttpRequest is the original AJAX object. xhr.open(method, url, async) configures the request: "GET" is the HTTP method, the URL is where to send it, and true means asynchronous (non-blocking). setRequestHeader adds headers — here we tell the server we expect JSON.

xhr.onload = function() {
  if (xhr.status >= 200 && xhr.status < 300) {
    const data = JSON.parse(xhr.responseText);
    console.log(data);
  } else {
    console.error("Request failed:", xhr.status);
  }
};

The onload event fires when the response arrives. We check the HTTP status: 200–299 means success. xhr.responseText contains the raw response body as a string. JSON.parse() converts it from a JSON string into a JavaScript object.

xhr.onerror = function() {
  console.error("Network error");
};

xhr.send();

onerror handles network-level failures (no internet, DNS failure, server unreachable). xhr.send() actually dispatches the request. For POST requests, you’d pass data here: xhr.send(JSON.stringify({ name: "Alice" })).

Fetch API (The Modern Way)

fetch("https://api.example.com/users")
  .then(response => {
    if (!response.ok) throw new Error(`HTTP ${response.status}`);
    return response.json();
  })
  .then(data => console.log(data))
  .catch(error => console.error(error));

The Fetch API is built into modern JavaScript and replaces XMLHttpRequest. fetch(url) returns a Promise — a promise to eventually give you a response.

The first .then() runs when the HTTP response arrives. response.ok is true for status 200–299. We call response.json() which also returns a Promise (because parsing JSON takes time for large responses).

The second .then() receives the parsed JavaScript object — our actual data.

.catch() handles both network errors AND HTTP errors (since we manually throw for non-ok responses).

POST Request with Async/Await

async function createUser(user) {
  try {
    const response = await fetch("https://api.example.com/users", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify(user)
    });

    if (!response.ok) throw new Error(`HTTP ${response.status}`);
    return await response.json();
  } catch (error) {
    console.error("Failed to create user:", error);
  }
}

async/await makes asynchronous code read like synchronous code. The async keyword marks the function as asynchronous. await fetch(...) pauses execution until the fetch completes — but it doesn’t block the browser. Other JavaScript continues running.

For POST requests, we pass a configuration object: method: "POST" specifies the verb, headers tell the server we’re sending JSON, and body contains the data serialized as a JSON string.

Common Data Formats

// JSON (most common)
{"users": [{"id": 1, "name": "Alice"}]}

JSON is the standard format for modern APIs — lightweight, natively parsable by JavaScript, and human-readable.

// XML (legacy)
<users><user><id>1</id><name>Alice</name></user></users>

XML was the original “X” in AJAX. It’s verbose and harder to parse. Modern APIs almost exclusively use JSON.

Common Mistakes

  1. Forgetting to handle HTTP errors separately from network errors: Fetch only rejects on network failure, not on 404/500 — you must check response.ok explicitly
  2. Not parsing JSON responses: response is a Response object, not the data — you must call response.json() to extract it
  3. Blocking the UI with synchronous requests: Passing false as the third argument to xhr.open() (sync mode) freezes the browser — never do this
  4. Ignoring CORS errors: Browsers block cross-origin requests unless the server sends proper CORS headers — check the server, not your frontend code
  5. Not aborting stale requests: On a search-as-you-type field, old requests may resolve after newer ones, showing outdated results — use AbortController to cancel in-flight requests

Practice Questions

Q1: What is the difference between XMLHttpRequest and Fetch API? A1: Fetch uses Promises and is built into modern JavaScript. XMLHttpRequest uses event-based callbacks and is more verbose. Fetch is recommended for new code.

Q2: Why does the Fetch API not reject on HTTP error status codes (404, 500)? A2: Fetch only rejects on network failures. HTTP errors are considered successful communications — you must check response.ok to handle them.

Q3: What problem does AbortController solve in AJAX requests? A3: It allows canceling in-flight requests. This is essential for search-as-you-type inputs where a new request should cancel the previous one to avoid race conditions.

Challenge: Build a GitHub user search app with an input field, a debounced Fetch API call to https://api.github.com/users/{username}, loading state, error handling for 404 (user not found), and caching recent searches in a JavaScript Map to avoid redundant network calls.

FAQ

Is AJAX only for XML?
No. The name includes “XML” historically, but modern AJAX almost exclusively uses JSON. The technique works with any data format — JSON, XML, plain text, or binary.
What is CORS and why does it matter for AJAX?
CORS (Cross-Origin Resource Sharing) is a browser security mechanism that controls which domains can access resources from another domain. The server must include Access-Control-Allow-Origin headers to allow cross-origin requests.
Can AJAX work with local files?
Not from file:// protocol due to CORS restrictions. Use a local development server (http://localhost) for testing AJAX requests.
What’s the difference between AJAX and WebSocket?
AJAX is request-response (you ask, server answers, connection closes). WebSocket is a persistent, bi-directional connection for real-time communication. Use AJAX for API calls, WebSocket for live updates.

Try It Yourself

▶ Try It Yourself Edit the code and click Run

What’s Next

TopicDescription
HTTP ProtocolUnderstand the request/response cycle that AJAX relies on
JSONMaster the data interchange format used in modern AJAX
REST APIDesign RESTful APIs that AJAX clients consume

JavaScript Promises and async/await are essential for AJAX. Explore Node.js for server-side AJAX (HTTP clients), and Axios as a popular third-party HTTP library.

What’s Next

Congratulations on completing this Ajax tutorial! Here’s where to go from here:

  • Practice daily — Consistency is more important than long study sessions
  • Build a project — Apply what you learned by building something real
  • Explore related topics — Check out other tutorials in the same category
  • Join the community — Discuss with other learners and share your progress

Remember: every expert was once a beginner. Keep coding!

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro