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

分享给朋友:

相关文章

如何评价react native

如何评价react native

React Native 的优势 跨平台开发效率高 React Native 允许开发者使用 JavaScript 和 React 编写代码,同时生成 iOS 和 Android 应用,大幅减少开发成…

vue如何实现计算

vue如何实现计算

Vue 实现计算的方法 Vue 提供了多种方式来实现计算逻辑,包括计算属性、方法、侦听器等。以下是几种常见的实现方式: 计算属性(Computed Properties) 计算属性是基于它们的响应式…

vue如何实现id

vue如何实现id

在 Vue 中实现 ID 绑定 Vue 提供了多种方式为元素或组件绑定唯一的 ID,可以根据具体需求选择合适的方法。 方法一:使用 v-bind 绑定静态或动态 ID <template…

vue如何实现放大缩小

vue如何实现放大缩小

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

react中monent如何获取日期

react中monent如何获取日期

使用 Moment.js 获取当前日期 在 React 中通过 Moment.js 获取当前日期,可以直接调用 moment() 函数。它会返回包含当前日期和时间的 Moment 对象。 impo…

react 如何引入jquery

react 如何引入jquery

引入 jQuery 到 React 项目 在 React 项目中引入 jQuery 可以通过多种方式实现,但需要注意 React 和 jQuery 操作 DOM 的方式可能冲突,因此建议仅在必要时使用…