当前位置:首页 > React

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

2026-01-26 10:28:48React

使用 AbortController

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

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

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,便于复用。

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 应用中灵活地取消未完成的请求,避免潜在的内存泄漏或竞态条件问题。

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

分享给朋友:

相关文章

react实现vue

react实现vue

React 实现 Vue 功能 React 和 Vue 是两种不同的前端框架,但可以通过一些方法在 React 中实现 Vue 的特性。以下是几种常见 Vue 功能在 React 中的实现方式:…

vue如何实现排序

vue如何实现排序

实现数组排序 在Vue中实现数组排序可以通过computed属性或methods来处理。假设有一个数组items,可以创建一个计算属性返回排序后的数组: data() { return {…

vue如何实现放大缩小

vue如何实现放大缩小

Vue 实现放大缩小功能 在 Vue 中实现放大缩小功能可以通过多种方式实现,以下介绍几种常见的方法: 使用 CSS transform 缩放 通过绑定 CSS 的 transform: scal…

如何实现vue表格联动

如何实现vue表格联动

实现 Vue 表格联动的方法 数据绑定与响应式更新 通过 Vue 的响应式特性,将多个表格的数据绑定到同一个数据源或计算属性。当一个表格的数据发生变化时,另一个表格会自动更新。例如: data()…

vue如何实现记住我

vue如何实现记住我

实现“记住我”功能的步骤 在Vue中实现“记住我”功能通常涉及前端保存用户登录状态(如token)到本地存储,并在下次访问时自动恢复登录状态。以下是具体实现方法: 使用localStorage或co…

如何降低react版本

如何降低react版本

降低 React 项目版本的步骤 检查当前 React 版本 运行以下命令查看项目中安装的 React 当前版本: npm list react 或 yarn list react 修…