手写实现axios库请求方法实现

简介: 手写实现axios库请求方法实现

上一篇文章中,我们实现了axios对象的创建,我们今天来实现一下axios的请求操作


其实axios中无论是get请求还是post的请求最后都是走的request这个请求方法,所以我们要对axios中的request进行操作即可,首先要了解一下axios在发送请求的过程中做了那些事情


接下来我们来实现一下axios中的request方法

Axios.prototype = {
            // 请求方法
            request(config = {}) {
// 声明一个成功的promise,使得返回config返回的是一个成功的promise
            let promise =Promise.resolve(config);
// 声明一个数组,这里第二个参数声明一个undefined是为了做一个占位,如果没有这个值,运行会出现问题
            let chains=[dispatchRequest,undefined]
// 调用then方法进行指定回调,这里指定成功和失败的回调,这里由于使用promise所有这个result接收的就是一个对象处理成功过后的返回实例
         let result=   promise.then(chains[0],chains[1]);
        //  把promise返回出去
         return result
            }
        }

dispatchRequest函数中做的就是一个request方法中的一个then成功的操作函数,通过xhrAdapter函数去发送请求,返回的是请求成功或失败的操作

// dispatchRequest 函数
        function dispatchRequest(config){
// 这里通过then方法调用所以指明了xhrAdapter函数的返回值一定是一个promise对象,xhrAdapter函数作为我们的返回值,所以当前的dispatchRequest函数也一定是一个promise对象
return xhrAdapter(config).then(response=>{
// 对响应的结果进行返回
return response;
},error=>{
    // 返回失败则抛出错误
    throw error;
    console.log(error);
})
        }

xhrAdapter函数中包含的是一个通过promise对象封装原生XMLHttpRequest对象发送请求的操作,通过判断状态码和请求状态以此判定请求是否成功,如果请求状态是未返回状态则不进行操作,如果请求状态完成则进行判断状态码,如果状态码为成功的状态则进行返回resolve,否则返回reject

// 在这里,如果这个请求发送成功了,这个then方法中会去执行第一个回调函数,否则就会去执行第二个抛出错误
        function  xhrAdapter(config){
return new Promise((resolve,reject)=>{
    // 发送xhr请求
    const XHR=new XMLHttpRequest()
    // 初始化请求
    XHR.open(config.method,config.url);
    // 发送请求
    XHR.send()
    // 绑定事件
    XHR.onreadystatechange=function(){
// 判断请求状态是否成功
// 0:开始发送请求
// 1:正在发送请求
// 2:已经接收到全部响应内容
// 3:正在解析响应内容
// 4:请求完成
        if(XHR.readyState==4){
// 判断请求是否发送成功,请求响应状态码大于或等于200且小于300则是成功否则就是失败
if(XHR.status>=200&&XHR.status<300){
// 成功,则返回promise的成功状态,以此后几个函数会因此继续往下运行,
// 先会让dispatchRequest函授接收到成功的值
resolve({
    // 配置对象
    config:XHR.config,
    // 响应体
    data:XHR.response,
       // 响应头
       headers:XHR.getAllResponseHeaders(),
    //   XHR请求对象 
    request:XHR,
//  响应的状态码
    status:XHR.status,
    // 响应状态字符串
    statusText:XHR.statusText,
});
}else{
    // 失败就抛出错误
    reject(new Error('请求失败'))
}
        }
    }
})
      }

我们来使用一下,看一下结果

cd9918c197ac47019b8d0647c4a7e32a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

完美运行

代码我放到码上掘金上了,大家可以去看看

image.png

坚持努力,无惧未来


相关文章
|
30天前
|
JSON 前端开发 JavaScript
axios请求成功而$.ajax却不行排错
axios请求成功而$.ajax却不行排错
17 2
|
9天前
|
API
使用axios发送请求的格式是什么?示例代码
使用axios发送请求的格式是什么?示例代码
12 0
|
9天前
|
JSON JavaScript 前端开发
axios的post请求,数据为什么要用qs处理?什么时候不用?
axios的post请求,数据为什么要用qs处理?什么时候不用?
9 0
|
30天前
|
JavaScript
axios拦截器:每次请求自动带上 token
axios拦截器:每次请求自动带上 token
15 0
|
30天前
|
前端开发 JavaScript 数据格式
vue3中axios添加请求和响应的拦截器
vue3中axios添加请求和响应的拦截器
17 1
|
30天前
|
存储 算法 JavaScript
< 今日小技巧:Axios封装,接口请求增加防抖功能 >
今天这篇文章,主要是讲述对axios封装的请求,由于部分请求可能存在延时的情况。使得接口可能存在会被持续点击(即:接口未响应的时间内,被持续请求),导致重复请求的问题,容易降低前后端服务的性能!故提出给axios封装的配置里面,新增一个防抖函数,用来限制全局请求的防抖。
< 今日小技巧:Axios封装,接口请求增加防抖功能 >
|
30天前
axios中的get带参数的请求方法
axios中的get带参数的请求方法
|
30天前
|
JavaScript 数据格式
Vue axios请求拦截和相应拦截
Vue axios请求拦截和相应拦截
32 2
|
30天前
|
JavaScript
vue封装axios(用interceptors封装)
vue封装axios(用interceptors封装)
18 0