axios--源码剖析

打印 上一主题 下一主题

主题 1491|帖子 1491|积分 4483

源码目录结构


源码分析

axios与Axios的关系?


  • 从语法上来说: axios不是Axios的实例
  • 从功能上来说: axios是Axios的实例
  • axios是Axios.prototype.request函数bind()返回的函数
  • axios作为对象有Axios原型对象上的全部方法, 有Axios对象上全部属性
instance与axios的区别?


  • 雷同:
    (1) 都是一个能发恣意哀求的函数: request(config)
    (2) 都有发特定哀求的各种方法: get()/post()/put()/delete()
    (3) 都有默认配置和拦截器的属性: defaults/interceptors
  • 差异:
    (1) 默认配置很大概不一样
    (2) instance没有axios背面添加的一些方法: create()/CancelToken()/all()
axios运行的团体流程?



  • 团体流程:
    request(config) ==> dispatchRequest(config) ==> xhrAdapter(config)
  • request(config):
    将哀求拦截器 / dispatchRequest() / 响应拦截器 通过promise链勾通起来, 返回promise
  • dispatchRequest(config):
    转换哀求数据 ===> 调用xhrAdapter()发哀求 ===> 哀求返回后转换响应数据. 返回promise
  • xhrAdapter(config):
    创建XHR对象, 根据config举行相应设置, 发送特定哀求, 并接收响应数据, 返回promise
axios的哀求/响应拦截器是什么?



  • 哀求拦截器:
    在真正发送哀求前执行的回调函数
    可以对哀求举行检查或配置举行特定处置处罚
    乐成的回调函数, 传递的默认是config(也必须是)
    失败的回调函数, 传递的默认是error
  • 响应拦截器
    在哀求得到响应后执行的回调函数
    可以对响应数据举行特定处置处罚
    乐成的回调函数, 传递的默认是response
    失败的回调函数, 传递的默认是error
axios的哀求/响应数据转换器是什么?


  • 哀求转换器: 对哀求头和哀求体数据举行特定处置处罚的函数
  1. if (utils.isObject(data)) {
  2.    setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
  3.    return JSON.stringify(data);
  4. }
复制代码

  • 响应转换器: 将响应体json字符串剖析为js对象或数组的函数
  1. response.data = JSON.parse(response.data)
复制代码
response的团体结构

  1. {
  2.         data,
  3.         status,
  4.         statusText,
  5.         headers,
  6.         config,
  7.         request
  8.   }
复制代码
error的团体结构

  1. {
  2.        message,
  3.        response,
  4. request,
  5. }
复制代码
怎样取消未完成的哀求?


  • 当配置了cancelToken对象时, 生存cancel函数
    (1) 创建一个用于将来中断哀求的cancelPromise
    (2) 并定义了一个用于取消哀求的cancel函数
    (3) 将cancel函数传递出来
  • 调用cancel()取消哀求
    (1) 执行cacel函数, 传入错误信息message
    (2) 内部会让cancelPromise变为乐成, 且乐成的值为一个Cancel对象
    (3) 在cancelPromise的乐成回调中中断哀求, 并让发哀求的proimse失败, 失败的reason为Cancel对象
Axios二次封装

功能点


  • 统一举行哀求配置: 基础路径/超时时间等
  • 哀求过程中loading提示
  • 哀求大概需要携带token数据
  • 哀求乐成的value不再是response, 而是response.data
  • 哀求失败/出错统一举行处置处罚, 每个哀求可以不用单独处置处罚
编码实现与测试

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.   <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7.   <title>Axios二次封装</title>
  8.   <link rel="stylesheet" href="https://cdn.bootcss.com/nprogress/0.2.0/nprogress.css">
  9. </head>
  10. <body>
  11. <div>
  12.   <button onclick="getUsers()">获取用户列表</button>
  13.   <button onclick="getRepos()">获取仓库列表</button>
  14. </div>
  15.   
  16.   <!--
  17.     测试接口1: https://api.github.com/search/repositories?q=v&sort=stars
  18.     测试接口1: https://api.github.com/search/users?q=v
  19.   -->
  20.   <!--
  21.    1). 统一进行请求配置: 基础路径/超时时间等
  22.    2). 请求过程中loading提示
  23.    3). 请求可能需要携带token数据
  24.    4). 请求成功的value不再是response, 而是response.data
  25.    5). 请求失败/出错统一进行处理, 每个请求可以不用单独处理
  26.   -->
  27.   <script src="https://cdn.bootcss.com/axios/0.19.0/axios.js"></script>
  28.   <script src="https://cdn.bootcss.com/nprogress/0.2.0/nprogress.js"></script>
  29.   <script>
  30.     const instance = axios.create({
  31.       baseURL: 'https://api.github.com',
  32.       timeout: 15000
  33.     })
  34.     instance.interceptors.request.use(config => {
  35.       NProgress.start()
  36.       // 从local中读取前面保存的token数据
  37.       const token = localStorage.getItem('token_key') || 'xxxxx'
  38.       if (token) {
  39.         config.headers['token'] = token  // 请求头的名称为后台接口指定
  40.       }
  41.       return config
  42.     })
  43.     instance.interceptors.response.use(
  44.       response => {
  45.         NProgress.done()
  46.         return response.data
  47.       },
  48.       error => {
  49.         NProgress.done()
  50.         alert('请求出错了', error)
  51.         return error
  52.       }
  53.     )
  54.   </script>
  55.   <script>
  56.     function getUsers () {
  57.       instance.get('/search/users', {
  58.         params: {
  59.           q: 'v'
  60.         }
  61.       }).then(result => {
  62.         console.table(result.items)
  63.       })
  64.     }
  65.     function getRepos () {
  66.       instance.get('/search/repositories', {
  67.         params: {
  68.           q: 'v',
  69.           sort: 'stars'
  70.         }
  71.       }).then(result => {
  72.         console.table(result.items)
  73.       })
  74.     }
  75.   </script>
  76. </body>
  77. </html>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

来自云龙湖轮廓分明的月亮

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表