abort all Axios requests when change route use vue-router

Stefan Bogdanescu

Founder & Senior Architect · 2026-06-29

Laravel Company

Abort All Axios Requests When Changing Routes with Vue Router

When building modern Single Page Applications (SPAs) with frameworks like Vue.js and navigation libraries like Vue Router, managing asynchronous operations—especially network requests—is crucial. A common pitfall developers encounter is the issue you described: rapidly changing routes causes multiple, overlapping Axios requests to be initiated, which wastes bandwidth, burdens the server, and can lead to stale or erroneous data being processed once the user lands on a new page.

This post will dive deep into the problem and provide a robust, developer-focused solution using native browser APIs to gracefully cancel pending HTTP requests.

The Problem: Request Overload During Navigation

Consider a scenario where a user clicks through several navigation links very quickly. If each route change triggers an asynchronous data fetch (an Axios call), you end up with a queue of incomplete requests. For example, the request for /dashboard might be sent, but before it resolves, the user navigates to /profile, triggering another request that should have been cancelled. These pending requests consume resources and complicate state management.

The goal is simple: when a new navigation event occurs, we must tell any currently running or pending network requests to stop immediately.

The Solution: Using AbortController with Axios

The standard and most effective way to cancel an ongoing request in modern JavaScript environments, including those used within Vue applications, is by utilizing the AbortController API. Axios natively supports this cancellation mechanism by accepting an AbortSignal.

How AbortController Works

  1. Create a Controller: Before making the request, we create an AbortController instance.
  2. Get the Signal: We retrieve the signal object from the controller.
  3. Pass the Signal: We pass this signal object into the Axios configuration as the signal property.
  4. Aborting: When a route change happens, we call the .abort() method on the controller. This immediately signals all listeners (including the underlying network stack) to terminate the request.

Practical Implementation Example

Here is how you can refactor your data fetching logic in a Vue component to handle request cancellation effectively:

javascript
import axios from 'axios';
import { ref } from 'vue';

export default {
  setup() {
    const fetchData = async (url, signal) => {
      try {
        console.log(`Request started for: ${url}`);
        // Axios uses the signal property to manage cancellation
        const response = await axios.get(url, { signal });
        console.log(`Success for: ${url}`);
        return response.data;
      } catch (error) {
        // Check if the error was explicitly due to abortion
        if (axios.isCancel(error)) {
          console.log(`Request aborted for: ${url}`);
        } else {
          console.error(`Error fetching ${url}:`, error);
        }
        throw error; // Re-throw to handle application state correctly
      }
    };

    const currentSignal = ref(null);

    const loadData = async (route) => {
      // 1. Abort any previous request immediately upon route change
      if (currentSignal.value) {
        currentSignal.value.abort();
      }

      // 2. Create a new controller for the new request
      const controller = new AbortController();
      currentSignal.value = controller; // Store the signal for potential future cancellation

      try {
        console.log(`Initiating fetch for: ${route}`);
        const data = await fetchData(route, controller.signal);
        // Update component state with fetched data here
        return data;
      } catch (error) {
        // Handle the case where the request was cancelled
        if (axios.isCancel(error)) {
          console.warn(`Data fetch for ${route} was successfully aborted.`);
        } else {
          console.error('An unexpected error occurred:', error);
        }
      }
    };

    // Example usage when a route change triggers this function
    const navigateToProfile = () => {
        loadData('/api/user/profile');
    }

    return { loadData, navigateToProfile };
  }
}

Integration with Vue Router Lifecycle

To tie this cancellation logic directly to route changes in Vue Router, you can leverage lifecycle hooks or watch properties. Whenever the $route object changes, you trigger the cancellation of any outstanding operations before initiating a new one. This ensures that your application remains responsive and resource-efficient, adhering to best practices for API interaction, much like ensuring robust backend logic when dealing with data persistence handled by services like those in Laravel.

Conclusion

By mastering the use of AbortController in conjunction with Axios, you transform potentially chaotic asynchronous behavior into a predictable, controlled process. This technique is essential for building high-performance frontends where rapid navigation is common. Always treat network requests as ephemeral operations that require explicit lifecycle management. By implementing this pattern, you prevent request flooding, improve user experience by avoiding unnecessary loading spinners, and ensure your application scales efficiently.