一、Axios
Axios是一个类,它包含2个变量(interceptors、defaults)和9个函数(request、delete、get、head、options、post、put、patch、getUri)。
二、axios语法糖
axios是一个语法糖,从类型上面看,它是一个函数(typeof axios => "function"
)。他提供了一个特殊的语法(axios(config)
)去发送http请求。
var context = new Axios(defaultConfig);
var instance = bind(Axios.prototype.request, context);
axios是Axios实例的request函数,每次调用axios相当于调用context的request函数。所以直接使用axios(config)
发送请求相当于调用request函数。
三、Axios实例代理
utils.extend(instance, Axios.prototype, context);
utils.extend(instance, context);
Axios的原型上的所有函数和变量都被扩展axios上,这样之后axios可以当一个Axios的实例来使用。
四、语法扩展
除了一个语法糖和Axios实例的全部功能外,他还根据场景设计出了一些好用的函数
4.1 方便自己初始化一个Axios实例
axios.Axios = Axios;
4.2 方便config复用,使用create函数可以创造一个新的axios。区别在于这个比较弱,只有语法糖和基本的
axios.create = function create(instanceConfig) {
return createInstance(mergeConfig(axios.defaults, instanceConfig));
};
4.3 把取消请求需要变量的部分暴露出来(换我的话就挂载在window下面了)
axios.Cancel = require('./cancel/Cancel');
axios.CancelToken = require('./cancel/CancelToken');
axios.isCancel = require('./cancel/isCancel');
4.4 提供高并发的解决方案
首先提供Promise.all方法,同时执行多个请求,请求全部完成才返回,并且返回结果是一个数组,数组顺序跟请求完成时间无关,只跟放入的promise顺序有关。
axios.all = function all(promises) {
return Promise.all(promises);
};
然后提供数组拆解方法, spread函数就是你给他一个参数是多个的函数(function callback(param1,param2){}
),它还你一个参数是数组的函数(function wrap(arr){}
)。
function spread(callback) {
return function wrap(arr) {
return callback.apply(null, arr);
};
};
axios.spread = require('./helpers/spread');
这样做的目的是和axios.all配合解决高并发问题
//1. 不用spread
axios.all([request1,request2]).then(data_array=>{
var request1_data = data_array[0]
var request2_data = data_array[1]
})
//2. 用spread
axios.all([request1,request2]).then(axios.spread((request1_data ,request2_data )=>{
}))
五、图解
- axios是一个函数,它是对context的request函数的一个封装,每次
axios(config)
相当于context.request(config)
(原因是在bind函数中进行了绑定) - axios作为一个引用类型的变量,上面挂载了context的函数和变量
- axios扩展了很多方便的函数和变量