vue项目中 axios请求拦截器与取消pending请求功能 - 年少、 - 博客园

在开发vue项目中,请求是不可缺少的,在发送请求时常常需要统一处理一些请求头参数等设置与响应事件,这时利用请求拦截器再好不过。

这里以axios请求为例

实现了设置统一请求头添加token, 其中token在登录时被存入了localStorage中。

同时拦截器利用new cancelToken与定义的cancelPending方法实现了可以取消正在pending状态的请求,什么情况会需要取消请求呢?

如下两种情况:

1. 有一个局部分页时,用户快速点击第2页,然后继续点击第3页,如果网络不太稳定时,第2页的请求正在发送中,还未响应,但第3页的请求先响应了,过了一会第2 页请求才响应,这时用户处于第3页,但看到的数据确是第2页的,当然有人会说可以在发送请求过程中禁用掉分页按钮点击,但我感觉体验不太好,为何禁用呢,直接点击第3页时中断掉之前相同的请求即可。

2. 切换路由时,上一路由页面中仍有未响应的请求时切换了路由,应该把正在pending的所有请求中断取消掉。

 

下面是完整实现axios请求拦截器与取消pending请求功能的代码

复制代码

let pending = [];
let    cancelToken = axios.CancelToken;
let    cancelPending = (config) => {
pending.forEach((item, index) => {
if(!!config){
if(item.u == config.url){
item.f(); //取消请求
pending.splice(index, 1); //移除当前请求记录
};
}else{
item.f(); //取消请求
pending.splice(index, 1); //移除当前请求记录
}
});
};//验证登录状态
router.beforeEach((to, from, next) => {
//如果是需要验证登录状态的页面
if(to.matched.some(record => record.meta.requireAuth)){
let token = localStorage.getItem('token');
//如果已经登录,则正常进入
if(!!token){
cancelPending();
next();
}else{
next({'name': 'login', 'query': {'redirect': to.fullPath}});
};
}else if(to.name == 'login'){ //如果是登录页,则验证如果当前是登录状态自动跳转至系统主页,否则正常进入登录页
let token = localStorage.getItem('token');
//如果已经登录,则重定向至系统首页
if(!!token){
router.push({'name': 'SystemWelcome'});
}else{
next();
};
}else{ //其他页面正常进入
next();
};
});//axios 请求拦截器
axios.interceptors.request.use(config => {
let token = localStorage.getItem('token');
if (!!token) { // 判断是否存在token,如果存在的话,则每个http header都加上token
config.headers.Authorization = `token ${token}`;
};
cancelPending(config);
config.cancelToken = new cancelToken((c) => {
pending.push({'u': config.url, 'f': c});
});
return config;
}, err => {
return Promise.reject(err);
});
//响应拦截器
axios.interceptors.response.use(response => {
cancelPending(response.config);
return response;
}, error => {
if (error.response) {
switch (error.response.status) {
case 401:
// 返回 401 清除token信息并跳转到登录页面
localStorage.removeItem('token');
router.push({'name': 'login', 'query': {'redirect': router.currentRoute.fullPath}});
}
}
return {data: {}}; // 返回接口返回的错误信息(这里返回空对象是为了避免控制台报错)
});

复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gitbook 入门教程之解决windows热加载失败问题

破镜如何贴花黄 gitbook 在 Windows 系统无法热加载,总是报错! gitbook 是一款文档编写利器,可以方便地 markdown 输出成美观优雅的 html ,gitbook serve 启动服务器后,原来相貌平平的 markdown 丑小鸭摇身一变就成了倾国倾城的 html 绝色佳人. 如果源文件发生更改,Windows 却无…

理解DOM事件流的三个阶段 - Lxxyx的开发笔记 - SegmentFault 思否

本文主要解决两个问题: 什么是事件流 DOM事件流的三个阶段 起因 在学习前端的大半年来,对DOM事件了解甚少。一般也只是用用onclick来绑定个点击事件。在寒假深入学习JavaScript时,愈发觉得自己对DOM事件了解不够,遂打开我的《J…

支付宝APP支付 统一下单 php服务端 tp5

/*支付宝第三方支付 * *生成APP支付订单信息 * param number  uid 用户id * param string   token 用户token * param number  oid 订单id * param string   title 标题 * param string    body …

python第十九天(random、json、pickle、hashlib、hmac、shutil、shevle模块)

今日内容: 1. random 模块 2. json模块 3. pickle 模块 4.hashlib 模块 5. hmac 模块 6. shutil 模块 7. shelve 模块 1. random 模块: random 模块 获取随机值import randomfor i in range(10): print(random.random()) # random.random() 随机获取…

NodeJS入门04-Express路由和中间件 - 小之 - 博客园

nodeJS入门04-Express路由和中间件 Express框架是后台的Node框架,在后台的受欢迎的程度,和jQuery一样,就是企业的事实上的标准。 路由 路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。 路由是由一个 …

jmeter(四十五)常用Beanshell脚本

整理了一批jmeter常用的beanshell脚本供大家参考! 时间戳 import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; try{ Date date new Date(); //获取当前时间 SimpleDateFormat sf new SimpleDateFormat("yyyy-MM-dd HH:mm…

Critical error detected c0000374

我发现出现上述错误是 free 两次内存 float* ddnew float[2];delete[] dd;delete[] dd;转载于:https://www.cnblogs.com/hook-gou/p/9994662.html

nodejs开发 过程中express路由与中间件的理解 - pyj063 - 博客园

nodejs开发 过程中express路由与中间件的理解 nodejs开发 express路由与中间件 路由 通常HTTP URL的格式是这样的: http://host[:port][path] http表示协议。 host表示主机。 port为端口,可选字段,不提供时默认为80。 path指定请求资源的…

错误MSB4018 “ResolvePackageAssets”任务意外失败的解决方法

昨天系统奔溃了,重装系统后发现,之前写的.netcore项目打开后重新生成报错,错误如下严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MSB4018 “ResolvePackageAssets”任务意外失败。 NuGet.Packaging.Core.Packag…

(五)Unity插件生成

1)新建空的AndroidStudio工程,但是新建过程时最小SDK版本要与unity一致,如下图所示,本次操作均为api16 2)创建Library,如下图所示,新建module,然后选择Android Library。 新建模块为…

centeros7安装mysql - 风中追风_lonely - 博客园

转载自:https://www.linuxidc.com/Linux/2016-09/135288.htm 安装之前先安装基本环境:yum install -y perl perl-Module-Build net-tools autoconf libaio numactl-libs 1、配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.c…

失物招领平台6

昨天做了什么:学习了复选框、列表视图、网络视图,集体讨论了登录页面的构思 今天准备做什么:继续学习Android stdio,改善登录页面 遇到的问题:时间远远不够。转载于:https://www.cnblogs.com/sljslj/p/11056074.html

前后端交互json字符串

//将需要的参数转成json字符串,然后用utf-8编码 var obj encodeURIComponent(JSON.stringify(this.categories),"utf-8") //后台将前台的json字符串按照utf-8的格式解码,然后进行转换 RequestMapping(value "/updateMaterialDemoInfo.d…

CSS布局解决方案(终结版)

前端布局非常重要的一环就是页面框架的搭建,也是最基础的一环。在页面框架的搭建之中,又有居中布局、多列布局以及全局布局,今天我们就来总结总结前端干货中的CSS布局。 居中布局 水平居中 1)使用inline-blocktext-align &…

个人作业7 第一阶段SCRUM冲刺(七)

了解了一下云服务器,下载了阿里云。 然而搞了半天还是没应用上这个云服务器..转载于:https://www.cnblogs.com/jbwen/p/11071733.html

Dcloud HTML5 监听蓝牙设备 调用 原生安卓实现 - aspirant - 博客园

最近一直搞Dcloud ,这是HTML5版本的开发,打包时候,可以打包成 apk 和ipa 分别运行在安卓和ios 机器上面, 但是这里面的资料很少,遇到问题,之后只能自己钻研总结, 现在有这么一个需求&#xff…

NOIP2018游记

NOIP 2018 游记 又是一年 \(NOIP\) 呢...第二次参加了,希望这一次能不再擦线吧...毕竟我真的很想去 \(WC\) ,也很想去省选. 最后悔的事就是在初三了,恰逢直升,大好年华,停课学 \(OI\) ,但我竟然在某两位 \(dalao\) 带领下搓了一年 炉石 \(\& \: SC2\) ?&#xf…

四叶草社交平台——十天冲刺(5)

今天没能安排好各种的任务,姑且拍了张照片就散了。 我的任务就是把登录功能完成,先让其他人把资源载入问题解决了,然后我再看看动态如何发送。 转载于:https://www.cnblogs.com/limitCM/p/10925161.html

Django forms组件

校验字段 模板文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <form action"" method"post"><p>用户名: <…

为什么要用TypeScript - 肉猪 - 博客园

为什么要用TypeScript 以下是本人的一点拙见&#xff0c;欢迎指正。 TypeScript的设计目的应该是解决JavaScript的“痛点”&#xff1a;弱类型和没有命名空间&#xff0c;导致很难模块化&#xff0c;不适合开发大型程序。另外它还提供了一些语法糖来帮助大家更方便地实践面向…