axios学习笔记(公用方法)

源码地址

找到入口文件

axios/lib/axios.js

  1. var utils = require('./utils');
  2. var bind = require('./helpers/bind')
  3. ...

学习bind

axios/lib/helpers/bind.js

为什么要先看bind呢,因为utils中引入了bind

  1. //目的将fn的执行上下文换成thisArg,并返回
  2. function bind(fn, thisArg){
  3. return functuon wrap(){
  4. //将类数组转化为数组,
  5. //es5 Array.prototype.slice.call(arguments) || [].slice.call(arguments)
  6. //es6 Array.form(arguments) || [...arguments]
  7. var args = new Array(arguments.length)
  8. for(var i = 0; i < arg.length; i++){
  9. args[i] = arguments[i];
  10. }
  11. //使用apply改变fn执行环境上下文,并返回
  12. return fn.apply(thisArg, args)
  13. }
  14. }

axios公共方法学习

axios/lib/utils.js

将稍微复杂的方法挑选出来

forEach方法

  1. //对obj进行循环,并将每一项val和key(数组为index)和本身(obj)变成fn的参数
  2. fcunction forEach(obj, fn) {
  3. //obj非空处理
  4. if(obj == null || typeof obj == 'undefined'){
  5. return;
  6. }
  7. //非array 和Object处理
  8. if(typeof obj != 'object') {
  9. obj = [obj];
  10. }
  11. //判断当前obj是否为数组,es6//Array.isArray(obj)
  12. if(Object.prototype.toString.call(obj) === '[object Array]') {
  13. //对数组for循环,对fn进行逐个绑定参数并执行
  14. for(var i = 0; i < obj.length; i++){
  15. return fn.call(null, obj[i], i obj);
  16. }
  17. }else{
  18. //对象for循环,对fn进行逐个绑定参数并执行
  19. for(var key in obj){
  20. return fn.call(null, obj[key], key, obj);
  21. }
  22. }
  23. }

merge方法

  1. function merge(/*obj1, obj2, obj3...*/){//浅合并
  2. var result = {}
  3. for(var i = 0; i < arguments.length; i++){
  4. //val为argument[i]中各项对应的值,key为对应的关键字或者下标
  5. function assginValue(val, key){
  6. //如果当前key对应的值已经在result存在且为对象,且val也为对象,需要进一步合并(即合并嵌套的对像)
  7. if(typeof result[key] === 'object' && typeof val === 'object'){
  8. result[key] = merge(result[key], val)
  9. }else{
  10. result[key] = val
  11. }
  12. }
  13. forEach(arguments[i], assginValue)
  14. }
  15. retutn result
  16. }

deepMerge方法

  1. functuon deepMerge(/*obj1, obj2, obj3...*/){//深度合并,区别遇到数组和对象不能直接复制,需要进行一个深度拷贝
  2. var result = {}
  3. function assginValue(val, key){
  4. if(typeof result(key) == 'object' && typeof val == 'object'){
  5. result[key] = deepMerge(result[key], val)
  6. }else if(typeof val === 'object'){//对赋值对象进行深度拷贝
  7. result[key] = deepMerge({}, val)
  8. }else{
  9. result[key] = val
  10. }
  11. }
  12. for(var i = 0;i < arguments.length; i++){
  13. forEach(arguments[i], assginValue)
  14. }
  15. return result
  16. }

extend方法

  1. function extend(a, b, thisArg){//a为需要被扩展项,b为具体需要扩展到a上的项,thisArg可选,为b对象上方法需要的执行上下文
  2. function assignValue(val, key){
  3. if(thisArg && typeof value === 'function'){
  4. a[key] = bind(val, thisArg)//将thisArg变成val方法的this指向,然后挂到对象a上,key为键值
  5. }else{
  6. a[key] = val//直接将val挂到a上,key为键值
  7. }
  8. }
  9. forEach(b, assignValue);
  10. return a;//返回新的a对象
  11. }

总结

在合并过程中,两对象如果有相同的key,后对象的key的值覆盖前对象

在forEach中虽然有做数组判定,但是由于ket取的下标,如果2数组合并,同下标后面值取带前方值,故合并方法传参皆为对象比较合适

axios源码入口以及公用方法的更多相关文章

  1. axios 源码分析(上) 使用方法

    axios是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它可以在浏览器和node环境下运行,在github上已经有六七万个星了,axios使用很方便,很多人在使用他,vu ...

  2. Axios源码深度剖析 - 替代$.ajax,成为xhr的新霸主

    前戏 在正式开始axios讲解前,让我们先想想,如何对现有的$.ajax进行简单的封装,就可以直接使用原声Promise了? let axios = function(config){ return ...

  3. Axios源码深度剖析

    Axios源码深度剖析 - XHR篇 axios 是一个基于 Promise 的http请求库,可以用在浏览器和node.js中,目前在github上有 42K 的star数 分析axios - 目录 ...

  4. Axios源码分析

    Axios是一个基于promise的HTTP库,可以用在浏览器和node.js中. 文档地址:https://github.com/axios/axios axios理解和使用 1.请求配置 { // ...

  5. html2canvas实现浏览器截图的原理(包含源码分析的通用方法)

    DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师. 官方网站:devui.design Ng组件库:ng-devui(欢 ...

  6. 一比一还原axios源码(零)—— 概要

    从vue2版本开始,vue-resource就不再被vue所维护和支持,官方也推荐使用axios,所以,从我使用axios至今,差不多有四五年了,这四五年的时间只能算是熟练应用,很多内部的实现和原理不 ...

  7. 一比一还原axios源码(一)—— 发起第一个请求

    上一篇文章,我们简单介绍了XMLHttpRequest及其他可以发起AJAX请求的API,那部分大家有兴趣可以自己去扩展学习.另外,简单介绍了怎么去读以及我会怎么写这个系列的文章,那么下面就开始真正的 ...

  8. 一比一还原axios源码(三)—— 错误处理

    前面的章节我们已经可以正确的处理正确的请求,并且通过处理header.body,以及加入了promise,让我们的代码更像axios了.这一章我们一起来处理ajax请求中的错误. 一.错误处理 首先我 ...

  9. 一比一还原axios源码(四)—— Axios类

    axios源码的分析,到目前为止,算上第0章已经四章了,但是实际上,还都没有进入axios真正的主线,我们来简单回顾下.最开始我们构建了get请求,写了重要的buildURL方法,然后我们处理请求体请 ...

随机推荐

  1. Java性能 -- CAS乐观锁

    synchronized / Lock / CAS synchronized和Lock实现的同步锁机制,都属于悲观锁,而CAS属于乐观锁 悲观锁在高并发的场景下,激烈的锁竞争会造成线程阻塞,而大量阻塞 ...

  2. JPA笔记4 ManyToMany

    package many_to_many; import java.util.HashSet; import java.util.Set; import javax.persistence.Entit ...

  3. js javascript map函数去重功能的使用实例

    js javascript map函数去重功能的使用实例 先上一个实战例子代码 var map = new Map(); for(var i=0; i<=9; i++){ map.set(i,i ...

  4. SimpleTagSupport 获取request、session

    开发jsp系统时,我们经常会用到tag来写java的逻辑代码,一般会继承两个类,一个是SimpleTagSupport,另一个是TagSupport,由于TagSupport书写配置比较复杂(我个人才 ...

  5. 关于VS2015 发布.net mvc 网站失败的问题

    问题:VS生成成功,发布失败,在“正在连接到***文件夹”处就不能继续了.. 项目开发告一段落,准备部署到服务器上进行最后测试,但是始终发布失败  生成成功,发布失败,没有任何提示信息 一开始以为是文 ...

  6. CRT&EXCRT学习笔记

    非扩展 用于求解线性同余方程组 ,其中模数两两互质 . 先来看一看两个显然的定理: 1.若 x \(\equiv\) 0 (mod p) 且 y \(\equiv\) 0 (mod p) ,则有 x+ ...

  7. 201871010123-吴丽丽《面向对象程序设计(Java)》第十五周学习总结

    201871010123-吴丽丽<面向对象程序设计(Java)>第十五周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  8. 201871010125 王玉江《面向对象程序设计(java)》第十三周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  9. 201871010135 张玉晶《面向对象程序设计(java)》第十二周学习总结

      内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/zyja/p/118654 ...

  10. socket_http

    socket_http import socket from urllib.parse import urlparse import time def get_url(url): # 通过socket ...