有封装过 axios 么?封装一个 axios?

import axios from 'axios'

// 创建axios实例
const service = axios.create({
baseURL: '',
timeout: '',
headers: {}
}) // 配置请求拦截器
// 接收两个参数
service.interceptors.request.use(
(confit) => {
// 在发送请求之前,需要做什么处理,可以在这里加
return config
},
(err) => {
// 对错误做些什么
return Promise.reject(err)
}
) // 添加响应拦截器
// 接收两个参数
axios.interceptors.response.use(
(res) => {
// 2xx 范围内的状态码都会触发该函数。
// 对响应数据做点什么
return res
},
(err) => {
// 超出 2xx 范围的状态码都会触发该函数。
// 对响应错误做点什么
return Promise.reject(err)
}
)

怎么取消一个请求?

axios 提供 CancelToken.source 用于取消请求

const CancelToken = axios.CancelToken
const source = CancelToken.source() const params = { name: '' }
const config = { cancelToken: source.token }
axios.post('api/test', params, config).catch(function (thrown) {
if (axios.isCancel(thrown)) {
// 请求被取消后的处理
} else {
// 处理错误
}
}) // 取消请求
source.cancel()

谈谈你对 axios 的理解?

axios 是基于 XMLHttpRequest 服务来执行 HTTP 请求,支持 Promise

可以拦截请求和响应

可以转换请求数据和响应数据,对相应的内容进行自动转换

为什么 axios 支持浏览器发送请求,也支持 node 发送请求?

使用的是适配器模式,判断环境,根据环境使用对应的适配器

  1. 在 default.js 文件中判断环境,然后根据环境使用对应的适配器
  2. 在 axios.defaults.adapter 中可以找到

axios 有哪些常用方法?

  • axios.get(url[, config])
  • axios.delete(url[, config])
  • axios.post(url[, data[, config]])
  • axios.put(url[, data[, config]])

说一下 axios 的相关配置属性?

  • url 请求的服务器 url
  • baseURL 将自动加载 url 前面,除非 url 是个绝对地址
  • headers 自定义请求头
  • params 是与请求一起发送的 URL 参数,必须是一个简单对象或 URLSearchParams 对象
  • transformRequest 允许在向服务器发送前,修改请求数据,只能用在 put、post、patch 这几个请求方法
  • responseType 表示浏览器将要响应的数据类型,默认 json,还有其他类型:arraybuffer、document、json、text、stream

axios 拦截器的原理?

Axios.prototype.request 是真正的请求

在 Axios.prototype.request 维护一个数组

将 request 请求拦截器放到数组的前面,将 response 响应拦截器放到数组的后面,

组成 Promise 链式调用

function Axios() {
this.interceptors = {
//两个拦截器
request: new interceptorsManner(),
response: new interceptorsManner()
}
} //真正的请求
Axios.prototype.request = function () {
let chain = [dispatchRequest, undefined] //这儿的undefined是为了补位,因为拦截器的返回有两个
let promise = Promise.resolve()
//将两个拦截器中的回调加入到chain数组中
this.interceptors.request.handler.forEach((interceptor) => {
chain.unshift(interceptor.fulfilled, interceptor.rejected)
})
this.interceptors.response.handler.forEach((interceptor) => {
chain.push(interceptor.fulfilled, interceptor.rejected)
})
while (chain.length) {
//promise.then的链式调用,下一个then中的chain为上一个中的返回值,每次会减去两个
//这样就实现了在请求的时候,先去调用请求拦截器的内容,再去请求接口,返回之后再去执行响应拦截器的内容
promise = promise.then(chain.shift(), chain.shift())
}
} function interceptorsManner() {
this.handler = []
} interceptorsManner.prototype.use = function (fulfilled, rejected) {
//将成功与失败的回调push到handler中
this.handler.push({
fulfilled: fulfilled,
rejected: rejected
})
} //类似方法批量注册,实现多种请求
util.forEach(['get', 'post', 'delete'], (methods) => {
Axios.prototype[methods] = function (url, config) {
return this.request(
util.merge(config || {}, {
//合并
method: methods,
url: url
})
)
}
})

Axios 面试题 (2023-09-15更新)的更多相关文章

  1. 前端面试题总结——HTML(持续更新中)

    前端面试题总结--HTML(持续更新中) 1.什么是HTML? HTML:HyperText Markup Language超文本标记语言 2.XHTML和HTML有什么区别 HTML是一种基本的WE ...

  2. Lean Data Innovation Sharing Salon(2018.09.15)

    时间:2018.09.15地点:北京国华投资大厦

  3. 2019年前端面试题 | CSS篇 (更新于4月15日)

    虽说刷面试题有走捷径之嫌,但我发现,对于我这样没有工作经历的人来说,其实是拓展自己实战技能和加深知识理解的一个好机会. 分享出来,也希望大家不要背完了事,正经的去细细琢磨各种原由. 本篇是一个题目合集 ...

  4. Web前端面试题整合,持续更新【可以收藏】

    饭后闲来无事,把这几年带学生用的一些面试题整合一下,供上!拿走,不客气!应付一般公司的二面基本上是够用了.祝你早日拿到心仪的offer. css相关 1. 万能居中 1.margin: 0 auto; ...

  5. java 面试题整理(不定期更新)

    一.Java基础 1.Java面向对象的三个特征与含义 三大特征是:封装.继承和多态. 封装是指将某事物的属性和行为包装到对象中,这个对象只对外公布需要公开的属性和行为,而这个公布也是可以有选择性的公 ...

  6. python 试题归纳及答疑 更新中.....

    一.Python基础篇(80题) 1.你为什么学习Python? 一.答题思路 1.阐述 python 优缺点 2.Python应用领域说明 3.根据自身工作情况阐述为什么会使用python 1)py ...

  7. iOS面试题总结(持续更新)

    过段时间打算跳槽,找了一些面试题来做,在这里做个总结方便review,希望能对要面试的童鞋有帮助. 以下为面试题: 运行以下代码会有什么结果 NSString *str1 = @"str1& ...

  8. Redis 面试题 - 收藏版 (持续更新、吐血推荐)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  9. 剑指offer面试题-Java版-持续更新

    最近在用Java刷剑指offer(第二版)的面试题.书中原题的代码采用C++编写,有些题的初衷是为了考察C++的指针.模板等特性,这些题使用Java编写有些不合适.但多数题还是考察通用的算法.数据结构 ...

  10. C#逻辑面试题汇总【不断更新中】

    (1)产生本月的月历,参考样式: 1 2 3 4 5 6 SU MO TU WE TH FR SA          01 02 03 04 05 06 07 08 09 10 11 12 13 14 ...

随机推荐

  1. 使用BAT脚本实现文件异机备份,并且还有文件的时间戳

    事件起因: 由于我们单位是创意设计公司,在设计文件的隐私性和保密性上都是有要求的,单位里的办公机的USB口都是禁用的,防治资料泄露:服务器之间还要做实时备份,并且文件的创建时间都是要保证准确性的.但是 ...

  2. SVN(Linux)提交时强制写日志

    SVN(Linux)提交时强制写日志 1.创建并修改pre-commit文件 进入svn/code/hooks目录,在svn版本库的hooks文件夹下面,复制模版pre-commit.tmplcp p ...

  3. /proc/sys/vm 使用

    这些参数主要是用来调整virtual memory子系统的行为以及数据的写出(从RAM到ROM). 这些节点(参数)的默认值和初始化的过程大部分都可以在mm/swap.c中找到. 目前,/proc/s ...

  4. 数据库周刊33丨腾讯Tbase新版本发布;“2020数据技术嘉年华”有奖话题遴选;阿里云技术面试题;APEX 实现数据库自动巡检;MYSQL OCP题库……

    摘要:墨天轮数据库周刊第33期发布啦,每周1次推送本周数据库相关热门资讯.精选文章.干货文档. 热门资讯 1.中国移动国产OLTP数据库中标公告:南大金仓阿里,万里开源中兴 分获大单[摘要]近日,中国 ...

  5. KubeSphere 在互联网医疗行业的应用实践

    作者:宇轩辞白,运维研发工程师,目前专注于云原生.Kubernetes.容器.Linux.运维自动化等领域. 前言 2020 年我国互联网医疗企业迎来了"爆发元年",越来越多居民在 ...

  6. KubeSphere 社区双周报 | OpenFunction v0.8.0 发布 | 2022-12-09

    KubeSphere 从诞生的第一天起便秉持着开源.开放的理念,并且以社区的方式成长,如今 KubeSphere 已经成为全球最受欢迎的开源容器平台之一.这些都离不开社区小伙伴的共同努力,你们为 Ku ...

  7. 字符串、列表、元组、字典(python)

    文章目录 1.python字符串 1.1 python访问字符串中的值 1.2Python 字符串连接 1.3Python字符串运算符 2.python列表 2.1访问列表中的值 2.2更新列表 2. ...

  8. Windows 非服务器版本永久关闭命令行“快速编辑模式”

    使用管理员权限运行cmd.exe 运行如下命令: reg add HKEY_CURRENT_USER\Console /v QuickEdit /t REG_DWORD /d 00000000 /f

  9. AI 居然说我是牛马,还画出了我牛马的一生,我绷不住了...

    今天真是服了,AI 居然敢嘲笑我是牛马,还直接甩了张大图到我脸上. 看来我的人生在 AI 眼中就是个笑话,从 "初级牛马" 一路升级到 "资深牛马".真是谢谢你 ...

  10. 干货分享:Air780E开发板如何使用?

    ​ 一.概述 CORE-AIR780E 开发板是合宙通信推出的基于 Air780E 模组所开发的,包含电源,SIM 卡,USB,天线,音频等必要功能的最小硬件系统.以方便用户在设计前期对 Air780 ...