有封装过 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. Windows NoiLinux

    在 Windows 下使用 NoiLinux ubuntu-noi-v2.0.iso 下载 ubuntu-noi-v2.0.iso 打开 VMWare,创建新的虚拟机 -> 自定义(高级)-&g ...

  2. word在原有的方框里打勾

    按住键盘上的ALT键不放,然后在小键盘区输入"9745"这几个数字,最后松开 ALT 键,自动变成框框中带勾符号.

  3. LeetCode 1000. Minimum Cost to Merge Stones (区间 DP)

    根据寒神题解 https://leetcode.com/problems/minimum-cost-to-merge-stones/discuss/247567/JavaC%2B%2BPython-D ...

  4. USB总线-Linux内核USB3.0主机控制器驱动初始化流程分析(十三)

    1.概述 RK3588有2个USB3.0 DRD控制器,2个USB2.0 Host控制器.USB3.0 DRD控制器既可以做Host,也可以做Device,向下兼容USB2.0和USB1.0.USB3 ...

  5. Java日期时间API系列36-----Jdk8中java.time包中的新的日期时间API类应用,使用LocalTime计算十二时辰。

    十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰.二十四小时和十二时辰对照表:     时辰 时间 24时制 子时 深夜 11:00 - 凌晨 01:00 23:00 - 01 : ...

  6. Oracle、MySQL等数据库故障处理优质文章分享 | 10月汇总

    墨天轮社区于9月起持续举办[聊聊故障处理那些事儿]DBA专题征文活动,每月进行评优发奖,鼓励大家记录工作中遇到的数据库故障处理过程,不仅用于自我复盘与分析,同时也能帮助其他的同仁们避坑. 上月为大家梳 ...

  7. nestjs 登录和验证码结合验证 svgCaptcha 包 session 会话标识

    // ps: 现在用户验证使用 token jwt 了 代替了 session // session 是服务器为每个用户建立的唯一标识 以区分用户 会话标识 // session 是express中的 ...

  8. Vmware挂载san存储_vSphere 6.x 共享存储LUN丢失分区表修复(精华)

    Vmware挂载san存储_vSphere 6.x 共享存储LUN丢失分区表修复 炎炎夏夜客户机房空调意外故障,前端ESXI物理服务器由于温度过高都自保关机,存储和SAN没有自保关机.上班修复空调后, ...

  9. 运营商业务系统基于 KubeSphere 的容器化实践

    本篇文章是 KubeSphere 2020 年度 Meetup 上讲师宋磊分享内容整理而成. 大家好,我是宋磊,在运营商的一个科技子公司任职,主要做大数据业务.我主要负责公司的 IaaS 层和 Paa ...

  10. T3 出行云原生容器化平台实践

    公司简介 T3 出行是南京领行科技股份有限公司打造的智慧出行生态平台,由中国第一汽车集团有限公司.东风汽车集团有限公司.重庆长安汽车股份有限公司发起,联合腾讯.阿里巴巴等互联网企业共同投资打造.公司以 ...