深入理解 JS Axios 调接口为何会重复请求两次

一、引言

在开发中,你可能会使用 axios 来发起 HTTP 请求。有些新手在使用 axios 时会发现,接口请求似乎总是被发送两次,这令他们感到疑惑。本文将逐步分析这一现象,帮助你了解这个问题的原因以及如何防止这种情况的发生。

二、流程概述

为了解决问题,我们将遵循以下步骤:

步骤 描述
1 安装 axios
2 创建 HTTP 请求
3 观察请求发出的情况
4 查找重复请求的原因
5 调整代码解决问题

三、逐步解析

1. 安装 axios

首先,你需要确保你项目中已经安装了 axios。可以通过 NPM 进行安装:

npm install axios

2. 创建 HTTP 请求

接下来,你可以创建一个简单的 GET 请求。下面是一个使用 axios 的基础示范:

import axios from 'axios'; // 导入 axios 库

// 定义一个函数来获取数据
const fetchData = async () => {
    try {
        const response = await axios.get('
        console.log(response.data); // 打印返回的数据
    } catch (error) {
        console.error(error); // 处理错误情况
    }
};

// 调用获取数据的函数
fetchData();
  • 导入 axios:我们需要引入 axios 才能使用它。
  • 定义 fetchData 函数:这是我们请求数据的函数。
  • 调用 axios.get:这里是发起 GET 请求。
  • 处理响应:打印返回的数据,或者处理错误。

3. 观察请求发出的情况

在浏览器的开发者工具中,网络标签(Network Tab)可以用来观察 HTTP 请求。当你刷新页面或调用 fetchData 函数时,可以观察到请求发生的次数。

4. 查找重复请求的原因

通常,接口被重复请求的原因有以下几种:

  • 组件重复渲染:在 React 或 Vue.js 等框架中,由于组件的生命周期问题,可能导致组件状态变化,从而引起请求被多次发送。
  • 副作用未管理好:在使用 hooks(如 React 的 useEffect)时,如果依赖项配置不当,也可能导致请求多次触发。
示例代码:使用 React 的 useEffect
import React, { useEffect } from 'react';
import axios from 'axios';

const App = () => {
    useEffect(() => {
        const fetchData = async () => {
            try {
                const response = await axios.get('
                console.log(response.data);
            } catch (error) {
                console.error(error);
            }
        };

        fetchData(); // 调用获取数据的函数

    }, []); // 依赖项为空数组,确保只执行一次

    return <div>Check the console for API response</div>;
};

export default App;
  • useEffect Hook:在组件加载完成后,执行 fetchData 函数。
  • 依赖项:此处依赖项为空数组意味着该函数只会在组件挂载时运行一次,防止重复请求。

5. 调整代码解决问题

如果仍然面临重复请求的问题,可以考虑一些优化手段:

  • 状态管理:引入状态管理工具如 Redux,能够有效控制请求的发起。
  • 取消请求:使用 axios 的 CancelToken,来取消未完成的请求。
示例代码:使用 CancelToken
import axios from 'axios';

let cancel; // 用于存储取消函数

const fetchData = async () => {
    // 先取消上一个请求
    if (cancel) {
        cancel();
    }
    
    const source = axios.CancelToken.source(); // 创建一个新的 CancelToken

    try {
        const response = await axios.get(' {
            cancelToken: source.token, // 将该 token 传入请求
        });
        console.log(response.data);
    } catch (error) {
        if (axios.isCancel(error)) {
            console.log('Request canceled', error.message);
        } else {
            console.error(error);
        }
    }

    cancel = source.cancel; // 将 cancel 函数存储
};

// 调用获取数据的函数
fetchData();
  • 创建 CancelToken:这是用来在新请求到来前取消旧请求的。
  • 通过 isCancel 判断:判断错误是否是由于请求被取消引起的。

四、结尾

经过以上的步骤和代码示例,我们对使用 axios 发送请求产生重复请求的原因进行了深入的分析。通过合适的代码管理,组件生命周期的清晰定义,以及合理地使用状态管理,我们可以有效地解决这个问题。希望这篇文章能帮助你更好地理解和使用 axios,在开发过程中更为得心应手。

如有任何疑问,欢迎随时提问。Happy coding!