網站首頁 編程語言 正文
一、原生ajax終止請求
1、abort()
? XMLHttpRequest.abort()
方法用于終止 XMLHttpRequest
對象的請求,該方法沒有參數,也沒有返回值。當調用該方法時,如果對應 XMLHttpRequest
對象的請求已經被發送并且正在處理中,則會中止該請求;如果請求已經完成(即已經接收到完整的響應),則不會執行任何操作。而且調用該方法后,還會觸發 XMLHttpRequest
對象的abort
事件,我們可以在該事件的處理函數中執行后續相關邏輯代碼,例如清除請求相關數據等等。
? 當一個請求被終止后,該請求的readyState
將會變為0
,并且status
屬性也會變為0
。
案例代碼:
// 創建XMLHttpRequest對象
const xhr = new XMLHttpRequest();
// 請求地址
const url = "https://developer.mozilla.org/";
// 初始化請求
xhr.open('GET', url, true);
// 發送請求
xhr.send();
// 監聽取消請求
xhr.addEventListener('abort', function () {
console.log('請求被abort()取消了');
});
// 定時器模擬取消請求
setTimeout(() => {
// 取消請求
xhr.abort();
// 取消請求之后的狀態status
console.log('abort()之后的xhr.status---', xhr.status);
// 取消請求之后的狀態readyState
console.log('abort()之后的xhr.readyState---', xhr.readyState);
}, 100);
執行結果:
二、axios終止請求
1、AbortController(新版本)
? 在axiso
的0.22.0
版本開始,需要使用瀏覽器原生的AbortController
來終止請求,是目前推薦用的方法。當使用該方法終止請求時,如果對應請求已經被發送并且正在處理中,則會中止該請求;如果請求已經完成(即已經接收到完整的響應),則不會執行任何操作。
? 我們想監聽到終止請求的操作,并進行后續處理,有兩種方法:① 使用AbortController
提供的onabort
事件,通過監聽該事件,并綁定事件處理函數,在函數中進行后續處理。② 使用try..catch
,終止請求之后,會觸發catch
,在catch
中進行后續處理。如果同時使用onabort
事件和try..catch
,則會先觸發onabort
事件,再觸發try..catch
。
案例代碼:
// 以vue項目中使用axios為例
// 創建請求控制器
this.controller = new AbortController();
console.log("初始聲明的請求控制器------", this.controller);
// 第一種方法:綁定事件處理程序
this.controller.signal.addEventListener("abort", () => {
console.log("請求已終止,觸發了onabort事件");
// 進行后續處理
});
// 第二種方法:try...catch
try {
// 發送文件上傳請求
const res = await this.$axios.post(api.Upload, uploadData, {
timeout: 0, // 設置超時時間為 0/null 表示永不超時
signal: this.controller.signal, // 綁定取消請求的信號量
});
} catch (error) {
console.log("終止請求時catch的error---", error);
// 判斷是否為取消上傳
if (error.message == "canceled"){
// 進行后續處理
};
}
// 終止請求
this.controller.abort();
console.log("終止請求后的請求控制器------", this.controller);
執行結果:
? 注意:每個AbortController
可以同時取消多個請求,但是只能取消請求一次,一個AbortController
在終止過請求之后,其控制是否終止請求的signal.aborted
屬性會從false
,變為true
,目前本人沒找到恢復為false
的方法,暫且認為是不可恢復的吧。如果后續請求還是綁定該請求控制器,則后續請求都會被提前終止,不會被發出。
? 如果我們想要在終止請求之后,不影響后續請求的正常發出,且后續請求也是可以被終止的,那么需要在每次發出請求之前,都通過構造函數創建一個新的的 AbortController
,每次請求綁定的都是新的AbortController
,這樣才能做到多次請求之間不干擾。
2、CancelToken(舊版本)
? 在axiso
的0.22.0
之前的版本,需要使用取消令牌cancel token
來終止請求,不過該API從0.22.0
開始被棄用,目前已不建議再使用。當使用該方法終止請求時,如果對應請求已經被發送并且正在處理中,則會中止該請求;如果請求已經完成(即已經接收到完整的響應),則不會執行任何操作。
? 該方法只能通過try..catch
來監聽取消請求操作,終止請求之后,會觸發catch
,在catch
中進行后續處理。而且該方法在取消請求時,可以通過參數自定義catch
的error
中的message
內容。
案例代碼:
// 以vue項目中使用axios為例
// 這個地方需要導入原生的axios 最好不要使用二次封裝后的axios
import axios from "axios";
// 創建請求令牌
this.source = axios.CancelToken.source();
console.log("初始聲明的請求令牌---", this.source);
// 第二種方法:try...catch
try {
// 發送文件上傳請求
const res = await this.$axios.post(api.Upload, uploadData, {
timeout: 0, // 設置超時時間為 0/null 表示永不超時
cancelToken: this.source.token, // 綁定取消請求的令牌
});
} catch (error) {
console.log("終止請求時catch的error---", error);
// 判斷是否為取消上傳
if (error.message == "自定義取消請求的message"){
// 進行后續處理
};
}
// 終止請求
this.source.cancel("自定義取消請求的message");
console.log("取消請求后的請求令牌---", this.source);
執行結果:
? 注意:該方法與AbortController
相同,都可以同時取消多個請求,但是只能取消請求一次,一個CancelToken
在終止過請求之后,如果后續請求還是綁定該請求令牌,則后續請求都會被提前終止,不會被發出。
? 同理,如果我們想要在終止請求之后,不影響后續請求的正常發出,且后續請求也是可以被終止的,那么需要在每次發出請求之前,都創建一個新的的 CancelToken
,每次請求綁定的都是新的CancelToken
,這樣才能做到多次請求之間不干擾。
三、參考資料
Axios中文文檔
AbortController
XMLHttpRequest.abort()
原文鏈接:https://blog.csdn.net/weixin_45092437/article/details/131211952
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-04-23 C語言Static?關鍵字解析_C 語言
- 2023-07-16 uni-app 自定義組件之星級評價分數
- 2022-07-23 C語言實例實現二叉搜索樹詳解_C 語言
- 2023-06-18 C#?System.TypeInitializationException?異常處理方案_C#教程
- 2023-07-27 使用Echarts圖表時,頁面切換后并且改變頁面窗口大小,再切回原來頁面Echarts圖表顯示有問題
- 2022-10-04 C語言指針和數組深入探究使用方法_C 語言
- 2023-07-10 VMware三種網絡模式配置詳解。
- 2022-04-22 阿里云ECS服務器Linux下載安裝JDK8
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支