首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在axios中取消/中止ajax请求

如何在axios中取消/中止ajax请求
EN

Stack Overflow用户
提问于 2016-07-12 12:40:57
回答 8查看 206.6K关注 0票数 121

我对ajax请求使用axios,对呈现UI使用reactJS + flux。在我的应用程序中有第三方时间线(reactJS组件)。时间线可以由鼠标滚动来管理。应用程序在任何滚动事件之后发送对实际数据的ajax请求。在服务器上处理请求可能比下一个滚动事件慢的问题。在这种情况下,应用程序可以有几个(通常是2-3个)请求,这些请求已经被废弃了,因为用户滚动得更远。这是一个问题,因为每次收到新的数据时间线开始重绘。(因为它是reactJS +通量)因此,用户多次看到时间线的移动。解决这个问题的最简单方法是,它只是中止先前的ajax请求,就像在jQuery中一样。例如:

代码语言:javascript
复制
    $(document).ready(
    var xhr;

    var fn = function(){
        if(xhr && xhr.readyState != 4){
            xhr.abort();
        }
        xhr = $.ajax({
            url: 'ajax/progress.ftl',
            success: function(data) {
                //do something
            }
        });
    };

    var interval = setInterval(fn, 500);
);

如何在axios中取消/中止请求

EN

回答 8

Stack Overflow用户

发布于 2020-05-04 08:55:19

使用useEffect钩子:

代码语言:javascript
复制
useEffect(() => {
  const ourRequest = Axios.CancelToken.source() // <-- 1st step

  const fetchPost = async () => {
    try {
      const response = await Axios.get(`endpointURL`, {
        cancelToken: ourRequest.token, // <-- 2nd step
      })
      console.log(response.data)
      setPost(response.data)
      setIsLoading(false)
    } catch (err) {
      console.log('There was a problem or request was cancelled.')
    }
  }
  fetchPost()

  return () => {
    ourRequest.cancel() // <-- 3rd step
  }
}, [])

注意:对于POST请求,将cancelToken作为第三个参数传递

代码语言:javascript
复制
Axios.post(`endpointURL`, {data}, {
 cancelToken: ourRequest.token, // 2nd step
})
票数 51
EN

Stack Overflow用户

发布于 2019-12-12 07:01:54

通常,您希望取消先前的ajax请求并忽略它即将出现的响应,只有当启动了该实例的新ajax请求时,才执行以下操作:

示例:从API:获得一些注释

代码语言:javascript
复制
// declare an ajax request's cancelToken (globally)
let ajaxRequest = null; 

function getComments() {

    // cancel  previous ajax if exists
    if (ajaxRequest ) {
        ajaxRequest.cancel(); 
    }

    // creates a new token for upcomming ajax (overwrite the previous one)
    ajaxRequest = axios.CancelToken.source();  

    return axios.get('/api/get-comments', { cancelToken: ajaxRequest.token }).then((response) => {
        console.log(response.data)
    }).catch(function(err) {
        if (axios.isCancel(err)) {
           console.log('Previous request canceled, new request is send', err.message);
        } else {
               // handle error
        }
    });
}
票数 30
EN

Stack Overflow用户

发布于 2019-03-06 11:52:52

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

const CancelToken = axios.CancelToken;

let cancel;

class Abc extends Component {
  componentDidMount() {
    this.Api();
  }

  Api() {
      // Cancel previous request
    if (cancel !== undefined) {
      cancel();
    }
    axios.post(URL, reqBody, {
        cancelToken: new CancelToken(function executor(c) {
          cancel = c;
        }),
      })
      .then((response) => {
        //responce Body
      })
      .catch((error) => {
        if (axios.isCancel(error)) {
          console.log("post Request canceled");
        }
      });
  }

  render() {
    return <h2>cancel Axios Request</h2>;
  }
}

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

https://stackoverflow.com/questions/38329209

复制
相关文章

相似问题

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