手写实现axios库取消请求实现

简介: 手写实现axios库取消请求实现

axios发送请求后,我们还可以对其取消请求操作,我们来实现一下取消请求,我们先创建一个取消构造函数

// 取消构造函数
    function CancelToken(executor){
        //声明一个变量,用于取消请求的执行
        let resolvePromise;
        // 为实例对象添加属性,此时如果进行实例化对象,那么实例化对上就有一个promise属性。并且值为promise对象,而且还是一个pending状态的promise,将resolve赋值给resolvePromise,这样的话只需要调用resolvePromise就可以改变当前promise属性的状态
        this.promise=new Promise((resolve)=>{
            resolvePromise=resolve
        })
        // 调用exector函数,他接受一个回调函数,他做的事情就是执行resolvePromise函数,这样就把当前实例对象上的promise对象状态变为成功
        executor(function(){
            resolvePromise()
        })
    }

在把取消请求操作添加到我们发送请求的适配器中,通过请求配置判断是否取消请求

function xhrAdapter(config) {
return new Promise((resolve, reject) => {
    const XHR = new XMLHttpRequest()
    XHR.open(config.method, config.url);
    XHR.send()
    XHR.onreadystatechange = function() {
        // 判断请求状态是否成功
        // 0:开始发送请求
        // 1:正在发送请求
        // 2:已经接收到全部响应内容
        // 3:正在解析响应内容
        // 4:请求完成
        if (XHR.readyState == 4) {
            if (XHR.status >= 200 && XHR.status < 300) {
                resolve({
                    // 配置对象
                    config: XHR.config,
                    // 响应体
                    data: XHR.response,
                    // 响应头
                    headers: XHR.getAllResponseHeaders(),
                    //   XHR请求对象 
                    request: XHR,
                    //  响应的状态码
                    status: XHR.status,
                    // 响应状态字符串
                    statusText: XHR.statusText,
                });
            } else {
                // 失败就抛出错误
                reject(new Error('请求失败'))
            }
        }
    }
    // 我们将取消请求放在这里,我们不能直接放在这里,因为会导致请求一发送就直接被取消的情况,所以我们这里就加一个判断,如果请求配置中包含了cancelToken参数,就执行把请求取消掉,顺带抛出请求执行失败
    if(config.cancelToken){
        config.cancelToken.promise.then(res=>{
            xhr.abort()
            // 将请求结果设置为失败
            reject(new Error('请求已经取消'))
        })
    }
})
}

我们创建俩个按钮,一个是发送请求,一个是取消请求

<button>发送请求</button>
<button>取消请求</button>

通过js获取到按钮元素进行绑定对应执行的事件

//声明一个全局变量,用于存储取消请求函数,便于执行
var cancal;
      // 发送请求
        btns[0].click = function() {
                //当我们去new CancelToken的时候,里面的代码就会执行,里面也会有一个promise属性,我们将executor回调函数传递进去,接受一个参数,也是一个回调函数,通过executor执行将promise的值赋值给cancal,只要我们这里一执行这个cancal就可以去取消请求
                let cancelToken = new CancelToken(function(callback) {
                    cancal = callback;
                })
                axios({
                    method: 'GET',
                    url: 'http://xxxx.com/login',
                    cancelToken: cancelToken
                }).then(res => {
                    console.log(res)
                    cancal = null
                })
            }
         // 取消请求
        btns[1].click = function() {
        //发送请求时,把取消的执行函数存储到了cancal变量中,所以我们在这里直接执行就可以了
            cancal()
        }

坚持努力,无惧未来!

相关文章
|
2月前
|
资源调度 JavaScript
|
2月前
|
缓存 JavaScript 搜索推荐
|
1月前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
47 2
|
21天前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
34 0
|
2月前
|
Python
axios的get请求传入数组参数
【10月更文挑战第11天】 当使用 `axios` 发送包含数组参数的 GET 请求时,默认的序列化方式可能与后端(如 Django)不兼容,导致无法正确获取数组参数。解决方案是通过 `paramsSerializer` 指定自定义序列化函数,或使用 `qs` 库来格式化数组参数,确保前后端一致。示例代码展示了如何使用 `qs` 库设置 `arrayFormat` 为 `&quot;repeat&quot;`,以符合 Django 的解析要求。
65 2
|
2月前
|
JSON JavaScript 前端开发
axios的post请求,数据为什么要用qs处理?什么时候不用?
axios的post请求,数据为什么要用qs处理?什么时候不用?
|
3月前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
51 6
|
2月前
|
前端开发 JavaScript UED
axios取消请求CancelToken的原理解析及用法示例
axios取消请求CancelToken的原理解析及用法示例
125 0
|
3月前
axios全局做节流,解决多次点击导致多次请求接口
本文介绍了如何在Axios请求中实现全局节流,以防止用户快速多次点击导致重复发送相同请求的问题。
79 2