AbortController helps you stop a task that is running, like a network request, when you no longer need it. This saves time and resources.
AbortController for cancellation in Node.js
Start learning this pattern below
Jump into concepts and practice - no test required
const controller = new AbortController(); const signal = controller.signal; // Pass signal to an async operation like fetch fetch(url, { signal }) .then(response => { /* handle response */ }) .catch(error => { if (error.name === 'AbortError') { // Handle cancellation } }); // To cancel the operation controller.abort();
The signal is passed to the async operation to listen for cancellation.
Calling controller.abort() triggers the cancellation.
const controller = new AbortController(); const signal = controller.signal; fetch('https://example.com/data', { signal }) .then(res => res.json()) .then(data => console.log(data)) .catch(err => { if (err.name === 'AbortError') { console.log('Fetch aborted'); } else { console.error('Fetch error:', err); } }); // Cancel after 2 seconds setTimeout(() => controller.abort(), 2000);
const controller = new AbortController(); const signal = controller.signal; async function loadData() { try { const response = await fetch('https://example.com/api', { signal }); const data = await response.json(); console.log('Data loaded:', data); } catch (error) { if (error.name === 'AbortError') { console.log('Loading cancelled'); } else { console.error('Error:', error); } } } loadData(); // Cancel after 1 second setTimeout(() => controller.abort(), 1000);
This program starts a fetch request to get a todo item. It cancels the fetch after 500 milliseconds. You will see the abort message if the fetch is stopped before completion.
import fetch from 'node-fetch'; const controller = new AbortController(); const signal = controller.signal; async function fetchWithCancel() { try { console.log('Starting fetch...'); const response = await fetch('https://jsonplaceholder.typicode.com/todos/1', { signal }); const data = await response.json(); console.log('Fetch completed:', data); } catch (error) { if (error.name === 'AbortError') { console.log('Fetch was aborted'); } else { console.error('Fetch error:', error); } } } fetchWithCancel(); // Abort the fetch after 500ms setTimeout(() => { console.log('Aborting fetch...'); controller.abort(); }, 500);
Always check for error.name === 'AbortError' to detect cancellation.
AbortController works well with fetch and other APIs that support signals.
Canceling tasks helps improve app performance and user experience.
AbortController lets you stop async tasks like fetch requests.
Pass the controller's signal to the task and call abort() to cancel.
Handle the abort error to respond properly when a task is cancelled.
Practice
AbortController in Node.js?Solution
Step 1: Understand AbortController's role
AbortController is designed to stop or cancel asynchronous tasks such as fetch requests.Step 2: Compare with other options
Creating servers, managing permissions, or handling databases are unrelated to AbortController's purpose.Final Answer:
To cancel ongoing asynchronous operations like fetch requests -> Option CQuick Check:
AbortController cancels async tasks = C [OK]
- Confusing AbortController with server or database management
- Thinking it manages permissions
- Assuming it creates servers
Solution
Step 1: Check correct instantiation syntax
AbortController must be created with 'new AbortController()' and its signal accessed via 'controller.signal'.Step 2: Identify errors in other options
const signal = new AbortController.signal(); wrongly calls signal as a constructor. const controller = AbortController(); const signal = controller.abort; misses 'new' and uses 'abort' instead of 'signal'. const controller = new AbortController; const signal = controller.abort(); misses parentheses on 'new AbortController()' and calls 'abort()' instead of accessing 'signal'.Final Answer:
const controller = new AbortController(); const signal = controller.signal; -> Option DQuick Check:
Use 'new' and access 'signal' property = B [OK]
- Forgetting 'new' keyword
- Calling 'abort' instead of accessing 'signal'
- Treating 'signal' as a constructor
const controller = new AbortController();
const signal = controller.signal;
setTimeout(() => controller.abort(), 100);
signal.addEventListener('abort', () => console.log('Aborted!'));Solution
Step 1: Understand the abort timing
The controller.abort() is called after 100 milliseconds using setTimeout.Step 2: Check event listener behavior
The signal listens for 'abort' event and logs 'Aborted!' when triggered.Final Answer:
Logs 'Aborted!' after 100 milliseconds -> Option AQuick Check:
Abort triggers event after delay = D [OK]
- Assuming abort happens immediately
- Expecting no output because of async delay
- Thinking it throws error instead of event
const controller = new AbortController();
const signal = controller.signal;
fetch('https://example.com', { signal });
controller.abort();
signal.addEventListener('abort', () => console.log('Fetch aborted'));Solution
Step 1: Check event listener timing
The abort event listener is added after calling controller.abort(), so it misses the event.Step 2: Verify other parts
The signal is correctly passed to fetch, and signal is the right object to listen on. Async/await is optional here.Final Answer:
Calling abort() before adding the abort event listener -> Option BQuick Check:
Add event listener before abort() call = A [OK]
- Adding listener after abort() call
- Listening on controller instead of signal
- Forgetting to pass signal to fetch
Solution
Step 1: Setup AbortController and timeout
Create controller, set timeout to call abort after 200ms.Step 2: Pass signal to fetch and handle abort error
Pass controller.signal to fetch options and catch AbortError to log timeout message.Step 3: Identify errors in other options
const controller = new AbortController(); fetch('https://api.com/data', { signal: controller.signal }); setTimeout(() => controller.abort(), 200); console.log('Request timed out'); logs timeout immediately, not on abort. const controller = new AbortController(); fetch('https://api.com/data'); setTimeout(() => controller.abort(), 200); .catch(err => console.log('Request timed out')); misses passing signal. const controller = new AbortController(); setTimeout(() => controller.abort(), 200); fetch('https://api.com/data', { signal: controller.abort() }) .catch(err => console.log('Request timed out')); incorrectly calls abort() instead of passing signal.Final Answer:
const controller = new AbortController(); setTimeout(() => controller.abort(), 200); fetch('https://api.com/data', { signal: controller.signal }) .catch(err => { if (err.name === 'AbortError') console.log('Request timed out'); }); -> Option AQuick Check:
Pass signal, abort after delay, catch AbortError = A [OK]
- Calling abort() instead of passing signal
- Logging timeout before abort happens
- Not passing signal to fetch
