有封装过 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 缺失Qt5.xxxx.dll,无法继续执行代码

    事件起因: 客户自行安装完Autodesk系软件后, 软件一直弹窗报错 AutodDesktopApp.exe - 系统错误 Windows软件报错:由于找不到Qt5.xxxx.dll,无法继续执行代 ...

  2. 如何创建免费版本的ABP分离模块?

    如何创建免费版本的ABP分离模块? 由于ABP最近官方大改革,我们打开ABP.IO 官方会发现通过Cli创建模板的时候不能创建Trered类型的了 就是创建一个分层的解决方案,其中Web和Http A ...

  3. nginx服务器下laravel项目无法访问

    nginx服务器下laravel项目无法访问 后台用的nginx服务器,之前在本地开发项目时用的apache服务器,没想到切换到线上访问时除了首页一直显示404的错误,网页无法访问,网上搜索发现是ng ...

  4. cpu proc sys文件系统下的含义

    proc文件系统(/proc/sys/kernel/) sched_child_runs_first /proc/sys/kernel/sched_child_runs_first是Linux内核中的 ...

  5. 将读取的.raw文件转换为tensor张量送入网络

    # coding:utf-8 import numpy as np import torch # 首先确定原图片的基本信息:数据格式,行数列数,通道数 rows=886#图像的行数 cols=492# ...

  6. C#的排序方法 OrderBy

    using System;using System.Collections.Generic;using System.Linq;using System.Net.Http;using System.R ...

  7. 关于自定义事件父子组件传值问题 $event

    1.$event 是 vue 提供的特殊变量,用来表示原生的事件参数对象 event 1.1在原生事件中,$event是事件对象 可以点出来属性 2.在原生事件中,$event是事件对象,在自定义事件 ...

  8. DOMException: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': 'function (header, parser) { header = normalizeHeader(header);

    场景:token过期,然后更新了token 重新发起请求获取数据 : 代码:使用上一次的错误请求配置报错     return request(error.config) : 解决 :  return ...

  9. git安装使用及连接gitlab集成idea

    一.简介 Git是一个开源的分布式版本控制系统,通过git可以对项目进行代码托管,通常配合GitLub.Github使用: 想了解更多请进官网(官网下载较慢):https://www.git-scm. ...

  10. 3.20 什么是环境变量,Linux环境变量有哪些?

    变量是计算机系统用于保存可变值的数据类型,我们可以直接通过变量名称来提取到对应的变量值.在 Linux 系统中,环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录(HOME).邮件存放 ...