• axios 如何取消已发送的请求?


    前言

    最近在项目中遇到一个问题,在连续发送同一请求时,如果第二次请求比第一次请求快,那么实际显示的是第一次请求的数据,这就会造成数据和我选择的内容不一致的问题。解决的方案:在后续发送请求时,判断之前的请求是否完成(同一个接口),如果未完成则立即取消。然后在发送新的请求。

    Axios 介绍

    Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。

    Axios 使用 cancel token 取消请求

    Axios 的 cancel token API 基于cancelable promises proposal,它还处于第一阶段。

    1. 可以使用 CancelToken.source 工厂方法创建 cancel token,像这样:
    var CancelToken = axios.CancelToken;
    var source = CancelToken.source();
    
    axios.get('/user/12345', {
      cancelToken: source.token
    }).catch(function(thrown) {
      if (axios.isCancel(thrown)) {
        console.log('Request canceled', thrown.message);
      } else {
        // 处理错误
      }
    });
    
    // 取消请求(message 参数是可选的)
    source.cancel('Operation canceled by the user.');
    

    2.还可以通过传递一个 executor 函数到 CancelToken 的构造函数来创建 cancel token:

    var CancelToken = axios.CancelToken;
    var cancel;
    
    axios.get('/user/12345', {
      cancelToken: new CancelToken(function executor(c) {
        // executor 函数接收一个 cancel 函数作为参数
        cancel = c;
      })
    });
    
    // 取消请求
    cancel();
    

    我自己在项目中用的是第二种方案:

    提取所有的 api 进行封装:

    import request from '../utils/request'  // 配置过的Axios 对象
    import axios from 'axios' 
    
    export function getLatenessDetailSize(params, that) { 
        return request({
            url: '/api/v1/behaviour/latenessDetailSize', 
            method: 'post',
            params: params,
            cancelToken: new axios.CancelToken(function executor(c) { // 设置 cancel token
                that.source = c;
            })
        })
    }
    
    export  xxx
    

    具体的业务组件:

    import { getLatenessDetail } from "../api";
    export default {
            data() {
                return {
                    tableData: [],
                    total: 0,
                    page: 1,
                    loadTable: false,
                    params: { },
                    source: null
                }
            },
            methods: {
                cancelQuest() {
                    if (typeof this.source === 'function') {
                        this.source('终止请求'); //取消请求
                    }
                },
                getTableData(val) {
                    this.cancelQuest() // 请求发送前调用
                    this.page = val
                    this.loadTable = true
                    getLatenessDetail(this.params, (val - 1) * 10, this)
                        .then(
                            res => {
                                this.loadTable = false
                                this.tableData = res.data
                            }
                    )
            }
    }
    
  • 相关阅读:
    JavaEE学习之Spring Security3.x——模拟数据库实现用户,权限,资源的管理
    Couchbase入门——环境搭建以及HelloWorld
    VS2010如何使用Visual Studio Online在线服务管理团队资源(在线TFS)
    JSP报错:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
    JavaEE学习之JAXB
    JavaEE学习之JPA中配置文件persistence.xml
    女朋友手速太慢,导致我无精打采。
    手机投屏之使命召唤
    智能灯改造计划
    女朋友老是埋怨我技术不行,于是我做了个辅助工具。
  • 原文地址:https://www.cnblogs.com/CatFish/p/9810218.html
Copyright © 2020-2023  润新知