首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用异步/等待的React应用程序中中止Axios请求?

如何在使用异步/等待的React应用程序中中止Axios请求?
EN

Stack Overflow用户
提问于 2022-06-16 20:14:27
回答 1查看 233关注 0票数 0

嗨,我创建了一个React钩子来处理Axios请求。我遇到的问题是,为了防止内存泄漏,我无法成功地中止请求。当我在使用钩子的两个页面之间切换时,我会得到错误:

无法对未挂载的组件执行反应状态更新。这是一个非操作,但它表示您的应用程序中存在内存泄漏。若要修复,请取消useEffect清理函数中的所有订阅和异步任务。

useAxios钩子代码:

代码语言:javascript
复制
import { useState, useEffect } from "react";
import axios from "axios";

const useAxios = (url, method = "GET") => {
  const [data, setData] = useState([]);
  const [error, setError] = useState(null);
  const [loading, setLoading] = useState(false);
  const [body, setBody] = useState(null);

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

    const getData = async (body) => {
      setLoading(true);

      try {
        const res = body
          ? await axios.post(url, body, {
              signal: controller.signal,
            })
          : await axios.get(url, {
              signal: controller.signal,
            });
        setData(res.data);
        setError(null);
        setLoading(false);
      } catch (err) {
        console.log(err.message);
        setError(err.message);
        setLoading(false);
      }
    };

    if (method === "GET") {
      getData();
    } else if (method === "POST") {
      getData(body);
    }

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

  return { data, error, loading, setBody };
};

export default useAxios;
EN

回答 1

Stack Overflow用户

发布于 2022-06-16 20:24:43

您的setErrorsetLoading在中止时都会触发。

因此,您需要在卸载回调中设置一个标志。然后,您可以基于此有条件地调用setError / setLoading

代码语言:javascript
复制
useEffect(() => {
  let aborting = false;
  try {
    ....
  } catch (err) {
    console.log(err.message);
    if (!aborting) {
        setError(err.message);
        setLoading(false);
    }
  } 
  ....
  return () => {
    aborting = true;
    controller.abort();
  }
}, ...

防止内存泄漏

只是一张纸条,这个伤口实际上不是一个记忆泄漏,它只是一个警告,它可能来自一个。例如:使用addEventListener而不使用removeEventListener。但是,在这两种情况下,您仍然希望防止setState出现在umounted组件上。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72651432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档