1. axios特点(面试常问)
- 基本promise的异步ajax请求库
- 浏览器端/node端都可以使用
- 支持请求/响应拦截器
- 支持请求取消
- 请求/响应数据转换
- 批量发送多个请求
- 有效防御xsrf攻击
2. axios常用语法
axios(config):通过/最本质的发任意请求的方式 axios(url,config):可以只指定url发get请求 axios.request(config):等同于axios(config) axios.get(url[,config):发get请求 axios.delete(url[,config):发getdelete请求 axios.post(url[,data,config):发post请求 axios.put(url[,data,config):发put请求 axios.defaults.xxx:请求的默认全局配置 axios.interceptors.request.use():添加请求拦截器 axios.interceptors.reponse.use():添加相应拦截器 axios.create([config]):创建一个新的axios(他没有下面的功能) axios.Cancel():用于创建取消请求的错误对象 axios.CancelToken():用于创建取消请求的token axios.isCancel():是否是一个取消请求的错误 axios.all(promise):用于批量执行多个异步请求 axios.spread():用来指定接受所有成功数据的回调函数的方法
3. 难点语法的理解和使用
3.1. axios.create(config)
- 根据指定配置创建一-个新的axios,也就就每个新axios都有自己的配置
- 新axios只是没有取消请求和批量发请求的方法,其它所有语法都是一致的
- 问:为什么 要设计这个语法?
(1) 需求:项目中有部分接口需要的配置与另一部分接口需要的配置不太一样,如何处理
(2)解决:创建2个新axios,每个都有自己特有的配置,分别应用到不同要求的接口请求中
4. 源码分析
4.1. axios与Axios的关系
- 从语法上来说;axios不是Axios的实例
- 从功能上来说:axios是Axios的实例,可以作为函数执行,可以作为对象执行
- axios是Axios.prototype.request函数bind()返回的
- axios作为对象由Axios原型对象上的所有方法,有Axios对象上的所有属性
4.2. instance与axios的区别
- 相同:
- 都是一个能发送任意请求的函数:request(config)
- 都有发特定请求的各种方法:get()/post()/put()/delete()
- 都有默认配置和拦截器的功能:de***ts/interceptors
- 不同:
- 默认匹配值可能不同
- instace没有axios后面添加的一些方法:create()/CancelToken()/all()
4.3 axios的流程图
4.4 axios的流程介绍(串联)
request(config)==>dispatchRequet(config)==>xhrAdaptor(config)
- promise链回调:config
// (unshift)请求拦截器,先添加后执行
=>(fulfilled2,rejected2)->(fulfilled1,rejected1)
=>(dispatchRequest,undefined) 发请求
// (push)响应拦截器
=>(fulfilled11,rejected11)->(fulfilled22,rejected22)
// axios发请求回调处理(我们自己定义的then)
=>(onResolved,onRejected)request(config)==串联
将请求拦截器/dispatchRequest()/响应拦截器
通过pormise链串联返回promise
dispatchRequet(config)===转换请求,响应数据,调用xhr发请求
转换请求数据=》调用xhrAdaptor(config)发请求=》
请求响应后转换响应数据=》返回promise
xhrAdaptor(config)===成功返回成功或失败promise
创建XHR对象,根据config进行相应设置,发送特定请求,并接受响应数据,返回promise
4.5 axios的请求/响应数据转换器是什么?
1. 请求转换器:对请求头和请求体数据进行特定处理的函数
if (utils.isObject(data)) {
setContentTypelfUnset(headers,'application/json;charset=utf-8');
return JSON.stringify(data);
}2. 响应转换器:将响应体json字符串解析为js对象或数组的函数
response.data = JSON.parse(response.data)
4.6 response整体结构
{
data,
status,
statusText,
headers,
config,
request
}4.7 error的整体结构
{
message,
request,
response
}4.8.如何取消未完成的请求?
当配置 了cancelToken 对象时
(1) 创建一个用于将来取消请求的cancelPromise
(2) 并定义了一个用于取消请求的cancel函数
(3) 将cancel函数传递出来
调用cancel()取消请求.
(1) 执行cacel函数,传入错误信息message
(2) 内部会让cancelPromise变为成功,且成功的值为一个 Cancel对象
(3) 在cancelPromise的成功回调中中断请求,并让发请求的proimse失败,失败的reason为Cacel对象



京公网安备 11010502036488号