当前位置:首页 > React

react如何实现发起请求前取消上一个请求

2026-01-26 10:28:48React

使用 AbortController

在 React 中,可以通过 AbortController 取消正在进行的请求。AbortController 是现代浏览器提供的 API,用于中断请求。

创建一个 AbortController 实例,并将其 signal 属性传递给 fetch 请求。当需要取消请求时,调用 abort() 方法。

react如何实现发起请求前取消上一个请求

const controller = new AbortController();
fetch(url, { signal: controller.signal })
  .then(response => response.json())
  .catch(err => {
    if (err.name === 'AbortError') {
      console.log('Request was aborted');
    }
  });

// 取消请求
controller.abort();

结合 useEffect 清理函数

在 React 组件中,通常在 useEffect 中发起请求。利用 useEffect 的清理函数,可以在组件卸载或依赖项变化时取消未完成的请求。

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

  const fetchData = async () => {
    try {
      const response = await fetch(url, { signal: controller.signal });
      const data = await response.json();
      setData(data);
    } catch (err) {
      if (err.name !== 'AbortError') {
        console.error('Fetch error:', err);
      }
    }
  };

  fetchData();

  return () => {
    controller.abort();
  };
}, [url]);

封装自定义 Hook

可以将取消请求的逻辑封装为自定义 Hook,便于复用。

react如何实现发起请求前取消上一个请求

function useFetch(url) {
  const [data, setData] = useState(null);
  const [error, setError] = useState(null);

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

    const fetchData = async () => {
      try {
        const response = await fetch(url, { signal: controller.signal });
        const result = await response.json();
        setData(result);
      } catch (err) {
        if (err.name !== 'AbortError') {
          setError(err);
        }
      }
    };

    fetchData();

    return () => {
      controller.abort();
    };
  }, [url]);

  return { data, error };
}

结合 Axios 取消请求

如果使用 Axios,可以通过 CancelToken 实现类似功能。Axios 提供了更简洁的取消请求方式。

useEffect(() => {
  const source = axios.CancelToken.source();

  const fetchData = async () => {
    try {
      const response = await axios.get(url, {
        cancelToken: source.token
      });
      setData(response.data);
    } catch (err) {
      if (!axios.isCancel(err)) {
        console.error('Axios error:', err);
      }
    }
  };

  fetchData();

  return () => {
    source.cancel('Operation canceled by the user.');
  };
}, [url]);

处理多个请求的场景

当需要处理多个请求时,可以为每个请求分配独立的 AbortControllerCancelToken,确保取消操作只影响目标请求。

useEffect(() => {
  const controllers = {};

  const fetchData = async (url, key) => {
    controllers[key] = new AbortController();

    try {
      const response = await fetch(url, { signal: controllers[key].signal });
      const data = await response.json();
      setData(prev => ({ ...prev, [key]: data }));
    } catch (err) {
      if (err.name !== 'AbortError') {
        console.error(`Fetch error for ${key}:`, err);
      }
    }
  };

  fetchData('/api/data1', 'data1');
  fetchData('/api/data2', 'data2');

  return () => {
    Object.values(controllers).forEach(controller => controller.abort());
  };
}, []);

通过以上方法,可以在 React 应用中灵活地取消未完成的请求,避免潜在的内存泄漏或竞态条件问题。

分享给朋友:

相关文章

h5如何实现vr效果

h5如何实现vr效果

使用WebXR API实现VR效果 WebXR是浏览器中实现VR/AR的核心API,支持设备姿态追踪、渲染交互等功能。需在支持WebXR的设备(如Oculus、HTC Vive)或浏览器模拟环境中运行…

react如何拓展

react如何拓展

React 拓展方法 使用高阶组件(HOC) 高阶组件是一种复用组件逻辑的方式,通过接收一个组件并返回一个新组件实现功能拓展。例如,为组件添加日志功能: function withLogging…

react如何开发

react如何开发

React 开发基础步骤 安装 Node.js 和 npm/yarn 确保系统已安装 Node.js(包含 npm)或 Yarn。React 项目依赖这些工具管理包和运行脚本。官方推荐使用 Node.…

如何安装react

如何安装react

安装React的方法 方法一:使用Create React App(官方推荐) Create React App是官方提供的脚手架工具,适合快速搭建React项目。确保已安装Node.js(建议版本≥…

react 如何debug

react 如何debug

React 调试方法 使用 React Developer Tools React Developer Tools 是浏览器扩展,支持 Chrome 和 Firefox。安装后,可以在开发者工具中查看…

react如何通信

react如何通信

React 组件通信方式 React 组件间的通信方式多样,具体选择取决于组件关系和场景需求。以下是常见方法: 父子组件通信 父组件通过 props 向子组件传递数据,子组件通过回调函数通知父组件…