【问题标题】:Axios not cancelling requestsAxios 没有取消请求
【发布时间】:2020-07-25 11:40:02
【问题描述】:

我正在尝试取消我在 ComponentWillUnmount() 中的 CompnentDidMount() 中提出的 Axios 请求,正如每个人所说的那样。但是,它似乎不起作用。完全一样。

这是我项目中的相关代码:

        //Make API call
        this.setState({ isMounted: true });
        this.axiosCancelSource = Axios.CancelToken.source();
        var result;
        result = await Axios("/api/product", { cancelToken: this.axiosCancelSource.token });
        if (this.state.isMounted) {
            this.setState({ products: result.data.products });
        }

        
        //this.updateList();


    }

    componentWillUnmount() {
        this.setState({ isMounted: false });
        this.axiosCancelSource.cancel();
    }

这是我在 Chrome DevTools 中的网络选项卡的快照: Network Screenshot

我不确定这是否是问题所在,但似乎我的组件安装和卸载一次非常快,然后再次安装。我也不太确定这是什么原因,或者它是否会影响我的 axios 请求的取消。我已经在互联网上搜索了几个小时试图解决这个问题,所以任何帮助表示赞赏。谢谢!

【问题讨论】:

    标签: reactjs axios cancellation


    【解决方案1】:

    来自反应文档:https://reactjs.org/docs/react-component.html#componentwillunmount

    您不应该在componentWillUnmount() 中调用setState(),因为该组件永远不会被重新渲染。一旦组件实例被卸载,它将永远不会被再次装载。

    对于您提到的奇怪行为,您应该从卸载中删除 setState。然后你可以验证你的 axios 取消。但是,请了解您在做什么 - 您在卸载时尝试取消任何 axios 调用 IF ANY IN PROGRESS。你需要模拟一个长时间运行的网络调用并卸载来测试它。

    【讨论】:

    • 我会尝试从 willUnmount 中取出 setState,但是我之前也有过这样的情况,但它的行为仍然相同。至于模拟长时间运行的网络调用,我不确定你的意思。在开发工具的网络选项卡中,这些网络调用只是说待处理,直到他们完成,然后他们说他们一次花了多长时间。它们通常需要 30 秒,因为我还没有优化。
    • 我的意思是,如果您要测试取消现有 API,此代码可能还不够,因为取消是在卸载时发生的。如果您想了解它是如何工作的,请尝试通过呈现 null 来卸载组件。就是这样。
    猜你喜欢
    • 2017-10-14
    • 2020-10-28
    • 2018-12-02
    • 2023-04-05
    • 1970-01-01
    • 2020-01-13
    • 2019-08-24
    • 1970-01-01
    • 2019-04-26
    相关资源
    最近更新 更多