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.pswp.cn/news/248986.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248986.shtml
英文地址,請注明出處:http://en.pswp.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;不適合開發大型程序。另外它還提供了一些語法糖來幫助大家更方便地實踐面向…