Vue 取消 axios 重复哀求,将性能优化进行到底(你知道发出去的哀求还能这 ...

打印 上一主题 下一主题

主题 495|帖子 495|积分 1485

优化版
   <el-button type=“plain” @click=“search”>搜索
此时,如果我们连续多次点击按钮,结果如下
在上一次哀求未响应完成,发起重复哀求,则将上一次哀求取消,以达到优化效果。
2、CancelToken 构造函数

我们也可以通过通报一个 executor 函数到 CancelToken 的构造函数来创建 cancel token
let CancelToken = axios.CancelToken;
let cancel;
axios.get(‘/user/12345’, {
cancelToken: new CancelToken(function executor© {
// executor 函数接收一个 cancel 函数作为参数
cancel = c;
})
});
// 取消哀求
cancel();
实例
如下方式也能达到取消重复哀求的效果
   <el-button type=“plain” @click=“search”>搜索
我们知道,发出去的哀求(处于pending阶段)可以使用以上两种方式进行取消或中断。那么,在真实的项目中,我们大概需要为全部的哀求进行此项优化(取消重复哀求),那又该怎样去实现?
全局哀求优化

这里会涉及到一个题目,我们为全局的哀求进行此项优化时,怎样判定是否为重复的哀求呢?如我在发送1哀求,紧接着去发送2哀求,此时不算是重复哀求,不需要取消;而当发送1哀求,1哀求还未响应完成时紧接着再去发送1哀求,此时判定为重复哀求,则实行取消上一次重复哀求的操纵。
1、怎样判定重复哀求?

当哀求方式、哀求 URL 和哀求参数都一样时,我们就可以认为哀求是一样的。因此在每次发起哀求时,我们就可以根据当前哀求的哀求方式、哀求 URL 地址和哀求参数来生成一个唯一的 key,同时为每个哀求创建一个专属的 CancelToken,然后把 key 和 cancel 函数以键值对的情势保存到 Map 对象中,使用 Map 的好处是可以快速的判定是否有重复的哀求
let pendingRequest = new Map();
// 生成唯一的key
let requestKey = [method, url, JSON.stringify(params), JSON.stringify(data)].join(‘&’);
let cancelToken = new CancelToken(function executor(cancel) {
if(!pendingRequest.has(requestKey)){
// 如果发送的哀求不存在,则进行保存
pendingRequest.set(requestKey, cancel); // 保存cancel函数,以便后续实行取消哀求操纵
}
})
当出现重复哀求的时候,我们就可以使用 cancel 函数来取消前面已经发出的哀求,在取消哀求之后,我们还需要把取消的哀求从 pendingRequest 中移除。
2、怎样取消重复哀求?

因为我们需要为全局哀求进行此优化,此时可以在拦截器上添加相关设置。
在设置哀求拦截器和响应拦截器前,我们先定义3个功能辅助函数。
getRequestKey:用于根据当前哀求的信息,生成唯一的哀求 key:
// 函数返回唯一的哀求key
function getRequestKey(config) {
let { method, url, params, data } = config;
return [method, url, JSON.stringify(params), JSON.stringify(data)].join(“&”);
}
addPendingRequest:用于把当前哀求信息添加到pendingRequest对象中:
let pendingRequest = new Map();
function addPendingRequest(config) {
let requestKey = getRequestKey(config);
config.cancelToken = config.cancelToken || new axios.CancelToken((cancel) => {
if (!pendingRequest.has(requestKey)) {
pendingRequest.set(requestKey, cancel);
}
});
}
removePendingRequest:查抄是否存在重复哀求,若存在则取消已发的哀求:
function removePendingRequest(config) {
let requestKey = getRequestKey(config);
if (pendingRequest.has(requestKey)) {
// 如果是重复的哀求,则实行对应的cancel函数
let cancel = pendingRequest.get(requestKey);
cancel(requestKey);
// 将前一次重复的哀求移除
pendingRequest.delete(requestKey);
}
}
3、设置拦截器

哀求拦截器
axios.interceptors.request.use(
function (config) {
// 查抄是否存在重复哀求,若存在则取消已发的哀求
removePendingRequest(config);
// 把当前哀求信息添加到pendingRequest对象中
addPendingRequest(config);
return config;
},
function (error) => {
return Promise.reject(error);
}
);
响应拦截器
axios.interceptors.response.use(
function (response) => {
// 从pendingRequest对象中移除哀求
removePendingRequest(response.config);
return response;
},
function (error) => {
// 从pendingRequest对象中移除哀求
removePendingRequest(error.config || {});
if (axios.isCancel(error)) {
console.log(“已取消的重复哀求:” + error.message);
} else {
// 添加非常处置惩罚
}
return Promise.reject(error);
}
);
完整实例
import axios from “axios”;
// 函数返回唯一的哀求key
function getRequestKey(config) {
let { method, url, params, data } = config;
return [method, url, JSON.stringify(params), JSON.stringify(data)].join(“&”);
}
// 添加哀求信息
let pendingRequest = new Map();
function addPendingRequest(config) {
let requestKey = getRequestKey(config);
config.cancelToken = config.cancelToken || new axios.CancelToken((cancel) => {
if (!pendingRequest.has(requestKey)) {
pendingRequest.set(requestKey, cancel);
}
});
}
// 取消重复哀求,移除重复哀求信息
function removePendingRequest(config) {
let requestKey = getRequestKey(config);
if (pendingRequest.has(requestKey)) {
自我先容一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到如今。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长大概是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技能停滞不前!
因此收集整理了一份《2024年Web前端开辟全套学习资料》,初衷也很简单,就是盼望能够帮助到想自学提升又不知道该从何学起的朋侪,同时减轻大家的负担。






既有适合小白学习的零基础资料,也有适合3年以上履历的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开辟知识点,真正体系化!
由于文件比较大,这里只是将部门目次大纲截图出来,每个节点里面都包含大厂面经、学习条记、源码课本、实战项目、解说视频,而且后续会持续更新
如果你以为这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)

竣事

一次完整的口试流程就是如许啦,小编综合了腾讯的口试题做了一份前端口试题PDF文档,里面有口试题的详细解析,分享给小伙伴们,有没有需要的小伙伴们都去领取!

一个人可以走的很快,但一群人才气走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入步伐员的圈子,让我们一起学习成长!
AI人工智能、Android移动开辟、AIGC大模子、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI计划、Unity3D、Web前端开辟、产物司理、车载开辟、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开辟、Flutter、IOS开辟、PHP开辟、.NET、安卓逆向、云计算
ToO-1712193693244)]
竣事

一次完整的口试流程就是如许啦,小编综合了腾讯的口试题做了一份前端口试题PDF文档,里面有口试题的详细解析,分享给小伙伴们,有没有需要的小伙伴们都去领取!

一个人可以走的很快,但一群人才气走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入步伐员的圈子,让我们一起学习成长!
AI人工智能、Android移动开辟、AIGC大模子、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI计划、Unity3D、Web前端开辟、产物司理、车载开辟、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开辟、Flutter、IOS开辟、PHP开辟、.NET、安卓逆向、云计算

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

梦应逍遥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表