【axios源码】axios语法糖

一、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 )=>{

}))

五、图解

图解结构
  1. axios是一个函数,它是对context的request函数的一个封装,每次axios(config)相当于context.request(config) (原因是在bind函数中进行了绑定)
  2. axios作为一个引用类型的变量,上面挂载了context的函数和变量
  3. axios扩展了很多方便的函数和变量

你可能感兴趣的:(【axios源码】axios语法糖)