Axios 面试题 (2023-09-15更新)
有封装过 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 发送请求?
使用的是适配器模式,判断环境,根据环境使用对应的适配器
- 在 default.js 文件中判断环境,然后根据环境使用对应的适配器
- 在 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更新)的更多相关文章
- 前端面试题总结——HTML(持续更新中)
前端面试题总结--HTML(持续更新中) 1.什么是HTML? HTML:HyperText Markup Language超文本标记语言 2.XHTML和HTML有什么区别 HTML是一种基本的WE ...
- Lean Data Innovation Sharing Salon(2018.09.15)
时间:2018.09.15地点:北京国华投资大厦
- 2019年前端面试题 | CSS篇 (更新于4月15日)
虽说刷面试题有走捷径之嫌,但我发现,对于我这样没有工作经历的人来说,其实是拓展自己实战技能和加深知识理解的一个好机会. 分享出来,也希望大家不要背完了事,正经的去细细琢磨各种原由. 本篇是一个题目合集 ...
- Web前端面试题整合,持续更新【可以收藏】
饭后闲来无事,把这几年带学生用的一些面试题整合一下,供上!拿走,不客气!应付一般公司的二面基本上是够用了.祝你早日拿到心仪的offer. css相关 1. 万能居中 1.margin: 0 auto; ...
- java 面试题整理(不定期更新)
一.Java基础 1.Java面向对象的三个特征与含义 三大特征是:封装.继承和多态. 封装是指将某事物的属性和行为包装到对象中,这个对象只对外公布需要公开的属性和行为,而这个公布也是可以有选择性的公 ...
- python 试题归纳及答疑 更新中.....
一.Python基础篇(80题) 1.你为什么学习Python? 一.答题思路 1.阐述 python 优缺点 2.Python应用领域说明 3.根据自身工作情况阐述为什么会使用python 1)py ...
- iOS面试题总结(持续更新)
过段时间打算跳槽,找了一些面试题来做,在这里做个总结方便review,希望能对要面试的童鞋有帮助. 以下为面试题: 运行以下代码会有什么结果 NSString *str1 = @"str1& ...
- Redis 面试题 - 收藏版 (持续更新、吐血推荐)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- 剑指offer面试题-Java版-持续更新
最近在用Java刷剑指offer(第二版)的面试题.书中原题的代码采用C++编写,有些题的初衷是为了考察C++的指针.模板等特性,这些题使用Java编写有些不合适.但多数题还是考察通用的算法.数据结构 ...
- 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 ...
随机推荐
- Web刷题之polarctf靶场(2)
1.蜜雪冰城吉警店 点开靶场, 发现题目说点到隐藏奶茶(也就是第九杯)就给flag, 但是明显就只有八杯, 猜测大概率考的是前端代码修改 把id=1修改为id=9, 然后回到页面点击原味奶茶即可弹出f ...
- acme+cloudflare生成免费证书(自动续期)
acme DNSapi acme DNSapi的作用是在申请证书时使用dns交易,acme可以通过dnsapi在对应的dns管理平台提交对应的dns记录.玩过证书的朋友都知道,证书申请时有三种验证方式 ...
- 【赵渝强老师】Kafka的消息持久化
1.Kafka消息持久性概述 Kakfa依赖文件系统来存储和缓存消息.对于硬盘的传统观念是硬盘总是很慢,基于文件系统的架构能否提供优异的性能?实际上硬盘的快慢完全取决于使用方式.同时 Kafka 基于 ...
- 随心所动,厂商的CPU核管理策略介绍
一.引文 随着CPU架构的发展,工艺的升级,带来性能提升,能效的提升(同性能下).但是由于极限性能的增加,也带来了peak功耗的增加(大部分情况下,能效比的提升无法抵消这部分),CPU功耗优化一直是广 ...
- Android平台下的cpu利用率优化实现
目录 背景 CPU调频 概念 实现 验证 线程CPU亲和性 概念 亲和性控制 API 应用层控制实现 验证 线程优先级 概念 实现 验证 背景 为了进一步优化APP性能,最近针对如何提高应用对CPU的 ...
- Android Perfetto 系列 3:熟悉 Perfetto View
1. Perfetto View 界面 抓到 Perfetto Trace 之后,一般是在 ui.perfetto.dev 中打开(如果用官方提供的脚本,则会在抓去结束后自动在这个网站上打开,想看看怎 ...
- 静态库封装之ComStr类
ComStr.h #pragma once #include <string> #include <vector> using namespace std; class Com ...
- JavaScript原型链污染探讨
如果你想弄明白什么怎样才可以实现JavaScript的原型链污染,那么你首先需要弄清楚两个东西,那就是__proto__和prototype. 到底什么才是__proto__和prototype? 那 ...
- Java 如何确保 JS 不被缓存
大家好,我是 V 哥.今天咱们来聊一聊 Java 后端确保 JavaScript 不被缓存的问题,先来了解一下为什么需要这样做,通常源于以下几种场景或问题: 1. 先来看几个问题 1. 文件更新后无法 ...
- direasch目录扫描
direasch目录扫描工具 安装: 1.github源码下载解压 使用 git 安装:(推荐git clone https://github.com/maurosoria/dirsearch.git ...