【问题标题】:React abort/cancel AJAX request. Axios or XHR反应中止/取消 AJAX 请求。 Axios 或 XHR
【发布时间】:2017-10-26 08:57:19
【问题描述】:

我刚刚开发了一个 SPA,需要帮助处理我通过 react componentDidMount 发送到我的服务器端(节点)的异步请求。查询有效,但如果我快速切换到不同的页面,ajax 响应中的 setState 函数仍在运行。虽然组件已卸载。

只能更新已安装或正在安装的组件。这通常意味着 您在未安装的组件上调用了 setState() 。这是一个无操作。 请检查未定义组件的代码。

为避免此错误,如果这是正确的方法,我想中止/取消我在 componentWillUnmount 上发送的请求。

我用 xml 和 axios 试过这个,但它不起作用。我希望你有一个适合我的例子。我对 fetch 等其他请求方法持开放态度。

代码看起来像这样(Axios),但它不会取消请求:

import * as React from 'react';
import axios from 'axios';

let CancelToken = axios.CancelToken;
let source = CancelToken.source();

class MakeAjaxRequest extends React.Component {
  constructor() {
    super();
    this.state = {
      data: {}
    }
  }

  componentDidMount() {
    const that = this;

    axios.get('/user/12345', {
      cancelToken: source.token
    })
      .then(function (response) {
        if (axios.isCancel(response)) {
          console.log('Request canceled', response);
        } else {
          that.setState({
            data: response.data
          });
        }
      })
      .catch(function (thrown) {
        if (axios.isCancel(thrown)) {
          console.log('Request canceled', thrown.message);
        } else {
          // handle error
        }
      });
  }

  componentWillUnmount() {
    source.cancel('Operation canceled by the user.');
  }

  //....other stuff, like render the data
}

【问题讨论】:

    标签: javascript ajax reactjs


    【解决方案1】:

    axios 有取消请求的选项:

    https://github.com/axios/axios#cancellation

    在组件卸载后防止 setState 触发某种回调的另一种方法是使用本地布尔变量存储组件是否已安装,即

    componentDidMount(){
       this._mounted = true;
    }
    
    componentWillUnmount() {
       this._mounted = false;
    }
    

    然后在axios回调中检查_mounted是否为真,然后再尝试调用setState()

    【讨论】:

    • 谢谢 Jayce444。你能告诉我为什么 componentWillUnmount() { source.cancel('操作被用户取消。');不能正常工作,我应该如何构建这个组件?
    • 是的,根据您的代码,它似乎与 axios 文档匹配。不知道为什么它不起作用,可能与回调中对this 的引用有关。检查您是否拥有最新的 axios 主要版本。我假设你已经确保componentWillUnmount 在你认为的时候实际上正在触发。如果是这样,也许尝试其他技术来看看是否有效,因为它依赖于相同的方法。抱歉帮不了你了:(
    猜你喜欢
    • 2016-11-14
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多