DevPrep
  • Interview Prep
  • Projects
  • Resources
  • Pricing
  • About Us
Submit Question
DevPrep
  • Pricing
  • About Us
Submit Question
  1. Home
  2. Articles
  3. Frontend Engineering
  4. AbortController: Cancelling Fetch Requests and More
XLinkedInReddit
MediumFrontend Engineering

AbortController: Cancelling Fetch Requests and More

D
DevPrep Team
February 10, 2026·2 min read·1
Table of Contents
  • Basic Usage
  • React: Cancel on Unmount
  • Race Condition Prevention
  • Timeout Pattern
  • Combining Signals
  • Beyond Fetch

AbortController is the standard way to cancel async operations in JavaScript. It's essential for preventing race conditions and memory leaks.

Basic Usage

const controller = new AbortController();

fetch("/api/data", { signal: controller.signal })
  .then(res => res.json())
  .then(data => console.log(data))
  .catch(err => {
    if (err.name === "AbortError") {
      console.log("Request was cancelled");
    } else {
      console.error("Fetch failed:", err);
    }
  });

// Cancel the request
controller.abort();

React: Cancel on Unmount

function UserProfile({ userId }) {
  const [user, setUser] = useState(null);

  useEffect(() => {
    const controller = new AbortController();

    fetch(`/api/users/${userId}`, { signal: controller.signal })
      .then(res => res.json())
      .then(setUser)
      .catch(err => {
        if (err.name !== "AbortError") console.error(err);
      });

    return () => controller.abort(); // Cleanup!
  }, [userId]);

  return user ? <div>{user.name}</div> : <Loading />;
}

Race Condition Prevention

function SearchResults({ query }) {
  const [results, setResults] = useState([]);

  useEffect(() => {
    const controller = new AbortController();

    // If query changes rapidly, previous requests are cancelled
    fetch(`/api/search?q=${query}`, { signal: controller.signal })
      .then(res => res.json())
      .then(setResults)
      .catch(err => {
        if (err.name !== "AbortError") console.error(err);
      });

    return () => controller.abort();
  }, [query]); // Previous fetch cancelled when query changes

  return <ul>{results.map(renderResult)}</ul>;
}

Timeout Pattern

async function fetchWithTimeout(url, timeout = 5000) {
  const controller = new AbortController();
  const timeoutId = setTimeout(() => controller.abort(), timeout);

  try {
    const response = await fetch(url, { signal: controller.signal });
    return await response.json();
  } finally {
    clearTimeout(timeoutId);
  }
}

// Or use AbortSignal.timeout() (modern browsers)
const response = await fetch(url, {
  signal: AbortSignal.timeout(5000)
});

Combining Signals

// AbortSignal.any() — abort if ANY signal fires
const userCancel = new AbortController();
const response = await fetch(url, {
  signal: AbortSignal.any([
    userCancel.signal,
    AbortSignal.timeout(10000)
  ])
});

Beyond Fetch

AbortController works with any API that accepts AbortSignal: addEventListener, ReadableStream, and custom async operations.

// Cancellable event listener
element.addEventListener("scroll", handler, { signal: controller.signal });
controller.abort(); // Removes the listener!

Related Articles

MediumFrontend Engineering

System Design #12: Design a Multi-Step Form Wizard

7 min read
MediumFrontend Engineering

Mastering Senior-Level JavaScript Interview Concepts

2 min read
MediumFrontend Engineering

System Design #9: Design a Collaborative Text Editor

9 min read

Comments (0)

Sign in to leave a comment.

No comments yet. Be the first to comment.

Table of Contents

  • Basic Usage
  • React: Cancel on Unmount
  • Race Condition Prevention
  • Timeout Pattern
  • Combining Signals
  • Beyond Fetch

Series

View all Frontend Engineering articles →

Practice

  • JavaScript
  • DSA
  • Machine Coding
  • System Design

Resources

  • Learning Tracks
  • Articles
  • Roadmaps
  • Compare Concepts
  • Glossary
  • Developer Tools
  • All Questions

Company

  • About
  • Pricing

Legal

  • Privacy Policy
  • Terms of Service
DevPrep

© 2026 DevPrep. All rights reserved.