axios的用法请参考: https://www.kancloud.cn/yunye...ios
今天分析axios的入口文件lib下的axios.js,以下图:axios
文件开头引入了一些辅助性的方法和对象:
utils: 主要是一些验证函数,好比isNumber isString isFunction isBuffer这种,
bind: 一个闭包函数segmentfault
module.exports = function bind(fn, thisArg) { return function wrap() { var args = new Array(arguments.length); for (var i = 0; i < args.length; i++) { args[i] = arguments[i]; } return fn.apply(thisArg, args); // fn的做用域中能够拿到thisArg中的属性和方法 }; };
Axios: axios的构造函数.就是说咱们用的axios({})是Axios的一个实例
mergeConfig: 一个函数,用来合并配置,就是将咱们传入的配置和默认配置合并
defaults: 默认对象.promise
文件内有一个建立实例的方法,以往的构造函数是直接用new关键字建立实例,axios使用这个:闭包
/** * 建立axios实例 * * @param {Object} defaultConfig 实例的默认配置 * @return {Axios} 返回一个新的实例 */ function createInstance(defaultConfig) { var context = new Axios(defaultConfig); // axios的构造函数的实例 // console.log('context',typeof context); var instance = bind(Axios.prototype.request, context); // 一个闭包,返回一个函数 第一个参数是方法,第二个是正常参数,调用instance时参数将传给Axios.prototype.request,将this指向context // 也就是axios({}),咱们传的对象传给了request // 将Axios.prototype的属性和属性值变成instance的属性和属性值 并返回instance utils.extend(instance, Axios.prototype, context); // 将context复制给实例 utils.extend(instance, context); // 将context的属性赋给instance,再将值经过bind给了instance return instance; // 是一个函数 axios({})就是instance({}) } // 建立默认的实例 var axios = createInstance(defaults); // defaults一个大的对象. 各类配置
而后给实例axios添加属性:app
// 公开 Axios 类并容许类继承 axios已是一个实例, 又添加了一个Axios属性,值是一个构造函数 axios.Axios = Axios; // 添加一个工厂用来建立新的实例 axios.create = function create(instanceConfig) { return createInstance(mergeConfig(axios.defaults, instanceConfig)); // createInstance方法的返回值 }; // 公开 Cancel & CancelToken axios.Cancel = require('./cancel/Cancel'); axios.CancelToken = require('./cancel/CancelToken'); axios.isCancel = require('./cancel/isCancel'); // 公开 all/spread axios.all = function all(promises) { return Promise.all(promises); // Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例 }; axios.spread = require('./helpers/spread'); // 公开 isAxiosError axios.isAxiosError = require('./helpers/isAxiosError'); module.exports = axios; // 容许使用模块化的default语法 module.exports.default = axios;