JavaScript 中如何取消請求
theme: geek-black
持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第21天,點選檢視活動詳情
本篇通譯自:https://levelup.gitconnected.com/how-to-cancel-a-request-in-javascript-67f98bd1f0f5
作者:Zachary Lee
眾所周知,JavaScript 實現非同步請求就靠瀏覽器提供的兩個 API —— XMLHttpRequest 和 Fetch。我們平常用的較多的是 Promise 請求庫 axios,它基於 XMLHttpRequest。
本篇帶來 XMLHttpRequest、Fetch 和 axios 分別是怎樣“取消請求”的。
閒話少說,衝就完事了~
取消 XMLHttpRequest *請求*
當請求已經發送了,可以使用 XMLHttpRequest.abort() 方法取消傳送,程式碼示例如下:
js
const xhr = new XMLHttpRequest();
xhr.open('GET', '<http://127.0.0.1:3000/api/get>', true);
xhr.send();
setTimeout(() => {
xhr.abort();
}, 1000);
取消請求,readyState 會變成 XMLHttpRequest.UNSENT
(0);請求的 xhr.status 會被設為 0 ;
不如在 Chrome DevTools Network 中,看看正常請求和取消請求的對比圖:
取消 *Fetch 請求*
取消 Fetch 請求,需要用到 AbortController API。我們可以構造一個 controller 例項:const controller = new AbortController()
, controller 它有一個只讀屬性 AbortController.signal,可以作為引數傳入到 fetch 中,用於將控制器與獲取請求相關聯;
程式碼示例如下:
```js const controller = new AbortController(); void (async function () { const response = await fetch('http://127.0.0.1:3000/api/get', { signal: controller.signal, }); const data = await response.json(); })();
setTimeout(() => { controller.abort(); }, 1000); ```
瀏覽器控制檯對比圖:
我們其實可以在 controller.abort() 傳入“取消請求的原因”引數,然後進行 try...catch 捕獲
取消 aixos 請求
axios 同樣支援 AbortController
js
const controller = new AbortController();
const API_URL = '<http://127.0.0.1:3000/api/get>';
void (async function () {
const response = await axios.get(API_URL, {
signal: controller.signal,
});
const { data } = response;
})();
setTimeout(() => {
controller.abort();
}, 1000);
控制檯截圖:
錯誤捕獲:
注意:axios 之前用於取消請求的 CancelToken 方法已經被棄用,更多請見文件 https://axios-http.com/docs/cancellation;
OK,以上便是本篇分享。點贊關注評論,為好文助力👍
我是掘金安東尼 🤠 100 萬閱讀量人氣前端技術博主 💥 INFP 寫作人格堅持 1000 日更文 ✍ 關注我,陪你一起度過漫長程式設計歲月 🌏
- ChatGPT 不過如此,Kosmos-1 更勝一籌?微軟這波又贏了
- “ChatGPT 們” 所需算力真是“貴滴誇張”!
- 國內有哪些對標 ChatGPT 的大語言模型? 5 大競品
- 常用!提前 reject promise 的 2 種場景,收藏等於學會
- 程式設計開發新朋友 —— ChatGPT 和 NotionAI 實戰
- 為什麼我更推薦 Notion AI 勝於 ChatGPT ?
- 推薦 5 個你大概率沒見過的免費 API ,一鍵獲取資料!
- ✨從純函式講起,一窺最深刻的函子 Monad
- 神馬?要退役 JavaScript ?!誰人出此狂言?!
- 寫出乾淨的 JavaScript 5 個小技巧
- 想要白嫖正則是吧?這一次給你個夠!
- 淺聊快取函式
- JavaScript 中如何取消請求
- 知其然,而知其所以然,JS 物件建立與繼承【彙總梳理】
- 10 個 Reduce 常用“奇技淫巧”
- 萬字年中總結,共勉
- 4 個 JavaScript 最基礎的問題 —— Eric Elliott
- 日拱演算法:搜尋二維矩陣 II
- 日拱演算法:多數元素
- 日拱演算法:只出現一次的數字