乐趣区

关于javascript:axios源码二

axios 的用法请参考: https://www.kancloud.cn/yunye…

明天剖析 axios 的入口文件 lib 下的 axios.js, 如下图:

文件结尾引入了一些辅助性的办法和对象:
utils: 次要是一些验证函数, 比方 isNumber isString isFunction isBuffer 这种,
bind: 一个闭包函数

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: 默认对象.

文件内有一个创立实例的办法, 以往的构造函数是间接用 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 增加属性:

// 公开 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;
退出移动版