Axios构造函数学习笔记

时间:2021-12-09 14:25:12

Axios 构造函数

lib/core/axios.js

...
var intercaptorManager = require(./IntercaptorManger);
var dispatchRequest = require(./dispatchRequest);

intercaptorManager 拦截器构造函数,添加拦截器,删除拦截器和拦截器执行

lib/core/IntercaptorManger.js

function IntercaptorManger() {
this.handlers = [];
} //在构造函数IntercaptorManger原型上添加use方法 添加对象到handlers中并返回下标
IntercaptorManger.prototype.ues = function use(fulfilled, rejected) {
this.handlers.push({
fulfilled: fulfilled,
rejected: rejected,
});
return this.handlers.length - 1;
} //在构造函数IntercaptorManger原型上添加eject方法, 移除handlers对应下标的对象
IntercaptorManger.prototype.eject = function eject(id) {
if(this.handlers[id]){
this.handlers[id] = null
}
} //在构造函数IntercaptorManger原型上添加forEach方法, 使handles对象一一传参到参数函数fn并执行
IntercaptorManger.prototype.forEach = function forEach(fn) {
utils.forEach(this.handlers, function forEachHandler(h) {//h表示this.handlers中具体的项
if(h !== null) {
fn(h)
}
})
}

dispathchRequest

用来处理config和调用默认adaptor的方法,同时做输入输出数据转化

lib/core/dispatchRequest

functuon throwIfCancellationRequest(config) {
config.cancelToken && config.cancelToken.throwIfRequest();
}
function transformData(data, headers, fns) {
utils.forEach(fns, function transform(fn) {
data = fn(data, headers)
})
}
function dispatchRequest(config) {
throwIfCancellationRequest(config);
config.headers = config.headers || {};
//tansformRequest用在发送数据前修改请求数据,数组类型,单个项为方法
//单个项方法中接受2个数据分别为config.data 和 config.headers, 必须返回data
configData = transformData(config.data, config.headers, config.transfromRequest);
//浅合并通用herders配置,方法headers配置以及自定义headers配置,层级逐渐增高
config.headers = utils.merge(config.headers.common || {}, config.headers[config.methods] || {}, config.headers);
//删除config.header[xxx]上的对象,已经合并到config.header上了, 可能并不存在
utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], function clearHeaderConfig(method) {
delete config.headers[method]
}) var adapter = config.adapter || defaults.adaptar;
//通过适配器向服务端发送请求,适配器方法返回通过promise包裹了
return adaptar(config).then(function onAdapterResolution(response) {
throwIfCancellationRequest(config);
//tansformResponse用在收到数据后修改响应数据,数组类型,单个项为方法
response.data = transformData(response.data, response.headers, config.transformResponse);
return response;
}, function onAdapterRejection(reason) {
if(isCancel(reason)){
throwIfCancellationRequest(config)
if(reason && reason.response) {
reason.response.data = transformData(reason.response.data, reson.response.headers, config.transforResponse)
}
}
return promise.reject(reason)
})
}

Axios 构造函数

lib/core/Axios.js

function Axios(intanceConfig) {
this.defaults = intanceConfig;
this.intercaptors = {
request: new IntercaptorManger(),
response: new IntercaptorManger(),
}
}
Axios.prototype.request = function request(config) {
if(typeof config === 'string'){
config = arguments[1] || {};
config.url = arguments[0];
} else {
config = config || {};
}
config = utils.merge(this.defaults, config);
//设置默认请方法,并转化为小写
if(config.method) {
config.method = config.method.toLowerCase();
} else if(this.defaults) {
config.method = this.defaults.method.toLowerCase();
} esle {
config.methos = 'get';
} var chain = [dispatchRequest, undefined];
var promise = Promise.resolve(config);
//调用Intercaptors.prototype上的forEach方法,对内部handles进行forEach循环,intercaptor表示this.handles中具体某项
this.intercaptors.request.forEach(function unShiftRequestIntercaptors(intercaptor) {
//向数组头部添加一个或者多个参数
chain.unshif(intercaptor.fulfilled, intercaptor.rejected);
})
this.intercaptors.response.forEach(function pushResponseIntercaptors(intercaptor){
//向数组后面添加一个或者多个参数
chain.push(intercaptor.fulfilled, intercaptor.rejected);
})
while(chain.length) {
promise = promise.then(chain.shift(), chain.shift())
}
return promise;
} Axios.prototype.grtUri = function grtUri(config) {
config = utils.merge(this.defaults, config);
//地址 参数, 解析方式
return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/g, '');
}
//给Axios原型上挂在具体请求方法,直接使用axios.xxx调用
//不需要参数的请求方法
utils.forEach(['delete, 'get', 'head', 'options'], function forEachMethodNoData(method) {
//地址 参数, 默认参数
Axios.prototype[method] = function(url, config) {
return this.request(utils.merge(config || {}, {method: method, url: url}))
}
})
//需要参数的请求方法
utils.forEach(['post', 'put', 'patch'], function forEachMethosWithData(method) {
Axios.prototype[method] = function(url, data, config){
return this.request(utils.merge(config || {}, {method: method, url: url, data: data, }))
}
})

Axios构造函数学习笔记的更多相关文章

  1. JavaScript构造函数学习笔记

    1 理解Javascript constructor实现原理 在 JavaScript 中,每个函数都有名为“prototype”的属性,用于引用原型对象.此原型对象又有名为“constructor” ...

  2. JavaScript构造函数学习笔记分享

    构造函数就是一个普通的函数,创建方式和普通函数没有区别 不同的是构造函数名习惯上首字母大写 普通函数是直接调用,而构造函数需要使用new关键字来调用 构造函数的执行流程: 立刻创建一个新的对象 将新建 ...

  3. [java学习笔记]java语言核心----面向对象之构造函数

    1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用:                给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...

  4. c++拷贝构造函数(翁恺c++公开课[26-27]学习笔记)

    这节课在p26.拷贝构造中讲的很清楚,建议大家耐心的去看下. 什么时候会发生拷贝构造: 对象之间的初始化赋值 使用对象作为变量进行函数传参(通常使用引用来传参从而减去不必要的拷贝构造,提高效率和代码健 ...

  5. axios学习笔记

    axios学习笔记axios文档源地址:https://github.com/axios/axios0.概念axios 在NPM上的描述是:Promise based HTTP client for ...

  6. Vue学习笔记十三:Vue+Bootstrap+vue-resource从接口获取数据库数据

    目录 前言 SpringBoot提供后端接口 Entity类 JPA操作接口 配置文件 数据库表自动映射,添加数据 写提供数据的接口 跨域问题 前端修改 效果图 待续 前言 Vue学习笔记九的列表案例 ...

  7. 两万字Vue.js基础学习笔记

    Vue.js学习笔记 目录 Vue.js学习笔记 ES6语法 1.不一样的变量声明:const和let 2.模板字符串 3.箭头函数(Arrow Functions) 4. 函数的参数默认值 5.Sp ...

  8. JavaScript权威设计--JavaScript函数(简要学习笔记十一)

    1.函数调用的四种方式 第三种:构造函数调用 如果构造函数调用在圆括号内包含一组实参列表,先计算这些实参表达式,然后传入函数内.这和函数调用和方法调用是一致的.但如果构造函数没有形参,JavaScri ...

  9. JavaScript权威设计--JavaScript函数(简要学习笔记十)

    1.函数命名规范 函数命名通常以动词为前缀的词组.通常第一个字符小写.当包含多个单词时,一种约定是将单词以下划线分割,就像"like_Zqz()". 还有一种就是"lik ...

随机推荐

  1. ubuntu 14.04安装pypcap

    直接sudo apt-get install python-pypcap即可 How to install python-pypcap on Ubuntu 12.04 (Precise Pangoli ...

  2. 前端工作流程自动化——Grunt/Gulp 自动化

    什么是自动化 先来说说为什么要自动化.凡是要考虑到自动化时,你所做的工作必然是存在很多重复乏味的劳作,很有必要通过程序来完成这些任务.这样一来就可以解放生产力,将更多的精力和时间投入到更多有意义的事情 ...

  3. DWZ(JUI) 教程 中如何整合第三方jQuery插件

    Query插件一般是$(document).ready()中初始化 $(document).ready(function(){  // 文档就绪,初始化jQuery插件| });  // 或者或缩写形 ...

  4. C# 实例化接口对象

    在head first 设计模式中 用到了很多很多接口对象 首先澄清一个问题,就是接口不仅可以声明对象,而且可以把对象实例化,还可以当做参数被传入. 一.接口回调 这就是继承中的向上转型.父类 FL= ...

  5. jQuery Ajax 实例 全解析

     jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是 ...

  6. XML Dtd Schema

    在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束. 整体比较: XML Schema符合XML语法结构. DOM.SAX等XML API很容易解析出XML Schem ...

  7. Freemodbus 1.5

    源:http://blog.sina.com.cn/s/blog_4935209001012eax.html 网站位置:http://www.freemodbus.org/index.php?lang ...

  8. Windows Server 2016-DNS客户端新增功能

    域名系统(DNS)是包含TCP / IP的行业标准协议套件之一,DNS客户端和DNS服务器一起为计算机和用户提供计算机名称到IP地址映射名称解析服务. 在Windows Server 2016中,DN ...

  9. Office 2016 自定义安装

    Office2016已经不提供自定义安装功能,而采用C2R安装方式.使用镜像安装时,默认全部安装.想要自定义安装就需要用到微软提供的Office2016部署工具. 步骤 下载并运行微软提供的Offic ...

  10. 从urllib2的内存泄露看python的GC python引用计数 对象的引用数 循环引用

    这里会发现上述代码是存在内存泄露,造成的原因就是lz与ow这两个变量存在循环引用,Python 不知道按照什么样的安全次序来调用对象的 __del__() 函数,导致对象始终存活在 gc.garbag ...