axios源码入口以及公用方法
axios学习笔记(公用方法)
找到入口文件
axios/lib/axios.js
var utils = require('./utils');
var bind = require('./helpers/bind')
...
学习bind
axios/lib/helpers/bind.js
为什么要先看bind呢,因为utils中引入了bind
//目的将fn的执行上下文换成thisArg,并返回
function bind(fn, thisArg){
return functuon wrap(){
//将类数组转化为数组,
//es5 Array.prototype.slice.call(arguments) || [].slice.call(arguments)
//es6 Array.form(arguments) || [...arguments]
var args = new Array(arguments.length)
for(var i = 0; i < arg.length; i++){
args[i] = arguments[i];
}
//使用apply改变fn执行环境上下文,并返回
return fn.apply(thisArg, args)
}
}
axios公共方法学习
axios/lib/utils.js
将稍微复杂的方法挑选出来
forEach方法
//对obj进行循环,并将每一项val和key(数组为index)和本身(obj)变成fn的参数
fcunction forEach(obj, fn) {
//obj非空处理
if(obj == null || typeof obj == 'undefined'){
return;
}
//非array 和Object处理
if(typeof obj != 'object') {
obj = [obj];
}
//判断当前obj是否为数组,es6//Array.isArray(obj)
if(Object.prototype.toString.call(obj) === '[object Array]') {
//对数组for循环,对fn进行逐个绑定参数并执行
for(var i = 0; i < obj.length; i++){
return fn.call(null, obj[i], i obj);
}
}else{
//对象for循环,对fn进行逐个绑定参数并执行
for(var key in obj){
return fn.call(null, obj[key], key, obj);
}
}
}
merge方法
function merge(/*obj1, obj2, obj3...*/){//浅合并
var result = {}
for(var i = 0; i < arguments.length; i++){
//val为argument[i]中各项对应的值,key为对应的关键字或者下标
function assginValue(val, key){
//如果当前key对应的值已经在result存在且为对象,且val也为对象,需要进一步合并(即合并嵌套的对像)
if(typeof result[key] === 'object' && typeof val === 'object'){
result[key] = merge(result[key], val)
}else{
result[key] = val
}
}
forEach(arguments[i], assginValue)
}
retutn result
}
deepMerge方法
functuon deepMerge(/*obj1, obj2, obj3...*/){//深度合并,区别遇到数组和对象不能直接复制,需要进行一个深度拷贝
var result = {}
function assginValue(val, key){
if(typeof result(key) == 'object' && typeof val == 'object'){
result[key] = deepMerge(result[key], val)
}else if(typeof val === 'object'){//对赋值对象进行深度拷贝
result[key] = deepMerge({}, val)
}else{
result[key] = val
}
}
for(var i = 0;i < arguments.length; i++){
forEach(arguments[i], assginValue)
}
return result
}
extend方法
function extend(a, b, thisArg){//a为需要被扩展项,b为具体需要扩展到a上的项,thisArg可选,为b对象上方法需要的执行上下文
function assignValue(val, key){
if(thisArg && typeof value === 'function'){
a[key] = bind(val, thisArg)//将thisArg变成val方法的this指向,然后挂到对象a上,key为键值
}else{
a[key] = val//直接将val挂到a上,key为键值
}
}
forEach(b, assignValue);
return a;//返回新的a对象
}
总结
在合并过程中,两对象如果有相同的key,后对象的key的值覆盖前对象
在forEach中虽然有做数组判定,但是由于ket取的下标,如果2数组合并,同下标后面值取带前方值,故合并方法传参皆为对象比较合适
axios源码入口以及公用方法的更多相关文章
- axios 源码分析(上) 使用方法
axios是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它可以在浏览器和node环境下运行,在github上已经有六七万个星了,axios使用很方便,很多人在使用他,vu ...
- Axios源码深度剖析 - 替代$.ajax,成为xhr的新霸主
前戏 在正式开始axios讲解前,让我们先想想,如何对现有的$.ajax进行简单的封装,就可以直接使用原声Promise了? let axios = function(config){ return ...
- Axios源码深度剖析
Axios源码深度剖析 - XHR篇 axios 是一个基于 Promise 的http请求库,可以用在浏览器和node.js中,目前在github上有 42K 的star数 分析axios - 目录 ...
- Axios源码分析
Axios是一个基于promise的HTTP库,可以用在浏览器和node.js中. 文档地址:https://github.com/axios/axios axios理解和使用 1.请求配置 { // ...
- html2canvas实现浏览器截图的原理(包含源码分析的通用方法)
DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师. 官方网站:devui.design Ng组件库:ng-devui(欢 ...
- 一比一还原axios源码(零)—— 概要
从vue2版本开始,vue-resource就不再被vue所维护和支持,官方也推荐使用axios,所以,从我使用axios至今,差不多有四五年了,这四五年的时间只能算是熟练应用,很多内部的实现和原理不 ...
- 一比一还原axios源码(一)—— 发起第一个请求
上一篇文章,我们简单介绍了XMLHttpRequest及其他可以发起AJAX请求的API,那部分大家有兴趣可以自己去扩展学习.另外,简单介绍了怎么去读以及我会怎么写这个系列的文章,那么下面就开始真正的 ...
- 一比一还原axios源码(三)—— 错误处理
前面的章节我们已经可以正确的处理正确的请求,并且通过处理header.body,以及加入了promise,让我们的代码更像axios了.这一章我们一起来处理ajax请求中的错误. 一.错误处理 首先我 ...
- 一比一还原axios源码(四)—— Axios类
axios源码的分析,到目前为止,算上第0章已经四章了,但是实际上,还都没有进入axios真正的主线,我们来简单回顾下.最开始我们构建了get请求,写了重要的buildURL方法,然后我们处理请求体请 ...
随机推荐
- C# 学习笔记 多态(一)虚方法
在面对对象编程中,类的三大特性分别为封装,继承,多态.其中多态的具体实现,依赖于三个方法,也就是虚方法,抽象类和接口. 多态的具体作用是什么呢?或者说多态的存在有什么意义呢?多态的存在有效的降低了程序 ...
- IOC : Unity 配置和使用
原文出自:IOC : Unity 配置和使用 之前Terry Lee 已经介绍过Unity的简单使用了,不过那篇文章是针对旧版本的,现在的版本1.2版略有不同. 我下载了Unity并做了一个简单的测试 ...
- 实施一套MES系统需要多少钱?
在制造业深耕的人都知道MES系统对于企业的重要性.MES生产执行系统是制造业生产现场透明化管理的最佳解决方案,制造业工厂通过实施MES系统可以解决生产计划.排产调度.工艺管理.品质管理.现场数据采集和 ...
- C# 测试网络速度例子
using System.Net.NetworkInformation; namespace PingExample { public partial class Form1 : Form { pub ...
- PHP初探--wamp安装配置
WAMP = Windows下的 Apache + MySQL+PHP WampServer的安装与配置 直接百度,下载后直接跟着安装步骤走就OK. 安装成功后,点击运行,然后电脑右下角会出现图标.服 ...
- java引用的强制转型
在java的面向对象的特性里,父类的引用可以指向子类的实例对象.但是,如果一个引用b(b本身指向了一个对象)想赋值给引用a,b不是a的类型且不是a的子类类型,那么就需要强制转换,并有失败的可能性,这个 ...
- Python的爬虫利器之urllib
urllib包 urllib是一个包含几个模块来处理请求的库: - urllib.request发送http请求 - urllib.error处理请求过程中出现的异常 - urllib.pars ...
- 其他综合-CentOS 7 搭建模板机
CentOS 7 搭建模板机 [基于此文章的环境]点我快速打开文章 1.修改静态地址 ip a|awk -F '[ /]+' '$NF~/eth0/ {print $3}' cat >/etc/ ...
- flask 基础2
一.装饰器的坑 在使用装饰器函数时候,当一个装饰器装饰多个函数的时候,会由于内存地址相同时发生报错,因为装饰的都是一个函数 所以就需要引入 import functools 重新定义每一个函数的名称 ...
- pdfium去掉v8支持
GYP_DEFINES='pdf_enable_v8=0 pdf_enable_xfa=0' build/gyp_pdfium 未测试 ???????????