美文网首页
从重构Axios学到了什么

从重构Axios学到了什么

作者: zdxhxh | 来源:发表于2020-02-16 23:33 被阅读0次

导语

最近,看了黄奕大神的typescript重构axios,并自己亲自实践了一遍。实践是检验真理的唯一标准。

记录一下axios中用到的骚操作

一、使用Promise数组实现拦截器

axios中可以实现请求还有响应的拦截器。如下 :

// use方法接收两个函数,并使用一个对象包裹存入自身
// use(
//   resolved,
//   rejected
// )
instance.interceptors.request.use(
  function(config: any) {
    // 发送请求前做什么事
    return config;
  },
  function(error: any) {
    // 请求错误时做些事
    return Promise.reject(error);
  }
);

instance.interceptors.response.use(
  (response: any) => {
    return response;
  },
  (error: any) => {
    return Promise.reject(error);
  }
);

axios内部原理:

const chain = [
  {
    resolved: dispatchRequest,  // 这是一个发送XMLHttpRequest的方法,并在onreadystatechange下resolve response的
    rejected: undefined
  }
]
const promise = Promise.resolve(config)
interceptors.request.forEach(interceptor=>{
  chain.unshift(interceptor)
})
interceptors.response.forEach(interceptor=>{
  chain.push(interceptor)
})
// 上面这个操作可以将chain 变为以下数据结构
// [request拦截器2,requset拦截器1,xhr请求,response拦截器1,response拦截器2]
let promise = Promise.resolve(config)
while (chain.length) {
  const { resolved, rejected } = chain.shift()
  promise = promise.then(resolved, rejected)
}

总结 : 就是数组结合promise.then不断将数据传递。

二、深合并deepMerge

deepMerge接收多个对象,然后返回一个结合这多个对象的船新版本对象

export function isPlainObject(val: any): val is Object {
  return toString.call(val) === '[object Object]'
}
export function deepMerge(...objs: any[]) {
  const result = Object.create(null)  // 使用Object.create(null) 创造的对象没有原型,所以比较节省内存
  // 遍历每一个入参对象
  objs.forEach(obj => {
    if (obj) {
      Object.keys(obj).forEach(key => {
        const val = obj[key]
        // 判断该属性是不是一个对象
        if (isPlainObject(val)) {
          // 判断result该属性是否已存在
          if (isPlainObject(result[key])) {
            // 将其继续合并
            result[key] = deepMerge(result[key], val)
          } else {
            result[key] = deepMerge({}, val)
          }
        } else {
          result[key] = val
        }
      })
    }
  })
  return result
}

总结: 深合并不是真合并,而是对传入的每个对象进行深拷贝,递归太难想了 - - !

三、如何判断一个URL是否与主域名一致

// 同域名判断
// 通过传入的url,将其设置为一个a标签的url,然后获取该DOM的protocol(协议)、host(域名)属性
// 传入url可以通过 axios({url:''})拿到
// 当前页面的url可以通过window.location.href拿到

export function isURLSameOrigin(requestURL: string): boolean {
  const parsedOrigin = resolveURL(requestURL)
  return (
    parsedOrigin.protocol === currentOrigin.protocol && parsedOrigin.host === currentOrigin.host
  )
}

const urlParsingNode = document.createElement('a')
const currentOrigin = resolveURL(window.location.href)

function resolveURL(url: string): URLOrigin {
  urlParsingNode.setAttribute('href', url)
  const { protocol, host } = urlParsingNode
  return {
    protocol,
    host
  }
}

四、使用Promise当一个状态机

该方法是在axios 的CancelToken使用。

let cancel 

// 实际上这种xhr是异步发送的 也就是包裹了promise发送的
axios({
  method: 'get',
  url: '/cancel/get',
  data: {
    a: 1,
    b: 2
  },
  CancelToken : new CancelToken(c=> {cancel = c })
})
// 所以这里必须使用setTimeout
setTimeout(() => {
  console.log(cancel('取消了异步请求'))
});
let c
const promise = new Promise(resovle=>{
  c = resolve
})
promise.then(()=> {
  console.log('存入一个回调了')
})
promise.then(()=> {
  console.log('存入一个回调了')
})
promise.then(()=> {
  console.log('存入一个回调了')
})
c();

原理 : 将Promise的excutor函数的入参使用闭包或者其他手段缓存,当使用then往该promise实例的onResolveCallbacks存入回调函数后,再调用resolve()将其触发。

相关文章

  • 从重构Axios学到了什么

    导语 最近,看了黄奕大神的typescript重构axios,并自己亲自实践了一遍。实践是检验真理的唯一标准。 记...

  • axios

    最近通过 Vuejs 重构旅游页面项目使用到 axios 获取数据。对照官方文档,简要记录一些 axios 的使用...

  • vue实现登录和个人信息组件展示

    最近在写一个重构node社区的小项目,碰到了登录的问题,实现思路如下:1.获取用户表单信息,使用axios提交,提...

  • axios

    项目中使用到axios,这里整理一下 axios的基础 为什么要使用axios? 什么是axios? Axios是...

  • 重构代码之美

    什么是重构; 为什么要重构; 什么时候重构; 怎样避免重构的现象; 重构的难点在哪里; 如何来实施代码重构; 重构...

  • Vue之Axios异步通信

    四、Axios异步通信 目录:什么是Axios、第一个Axios应用程序、Vue的生命周期 1.什么是Axios ...

  • 为何总有人说无用之用为大用:

    我们为何如此执着的去探索事物的本质?基因学、宇宙学、量子力学,从细微看,从宏观看,从过去看。 我们不断刷新、重构对...

  • 改善既有代码的设计笔记(三)代码的坏味道

    前面两篇笔记涉及到了部分重构的时机,本篇笔记全部为重构代码的时机。重构时机,不是僵硬死板的必须在什么时候执行,下面...

  • Axios

    axios源码阅读 1.为什么 axios 既可以当函数调用,也可以当对象使用,比如axios({})、axios...

  • 从研学中你学到了什么?

    文/雪中萍 孩子们: 四天三夜的研学活动结束了,这几天在批改大家的“研学笔记”,很多同学都能有话说,却只...

网友评论

      本文标题:从重构Axios学到了什么

      本文链接:https://www.haomeiwen.com/subject/xdjvfhtx.html