新的取消請求方式 - AbortController
# 前端在前端當中,我們主要可以透過兩種方式來發送請求:XHR 跟 Fetch。XHR 是從,嗯…,很久以前就有的 API。不過因為設定上很麻煩,所以時常被包裝成更高階的 API 使用,像是 jQuery 的 getJSON、axios、RxJS 的 AjaxObservable 等等。
而近幾年隨著 Promise 逐漸流行的 Fetch API 可以大幅改進這些問題。除了回傳值為 Promise,方便操作之外,API 也相當簡單。
不過儘管如此,還是有一項致命的缺點。Fetch 無法取消請求,雖然我們可以透過 setTimeout 的方式讓回傳值被忽略,不過請求一樣會繼續等待。在 XHR 裡頭,我們可以用 XMLHttpRequest.abort 來做取消,但 fetch 當中並沒有類似的 API。
直到最近!終於出現了新的救星,AbortController
The abort() method of the
AbortControllerinterface aborts a DOM request (e.g. a Fetch request) before it has completed. This is able to abort fetch requests, consumption of any responseBody, and streams.
使用方式很簡單
const abortController = new AbortController()
const signal = abortController.signal
然後再將 signal 傳入 fetch 就可以了。
fetch("/long-running", { signal: signal })
當你呼叫 abortController.abort 時,會透過 signal 傳到 fetch 裡頭。如果接收到 signal 時請求還沒完成,這個請求就會被取消。
fetch("/long-running", { signal: signal })
setTimeout(() => abortController.abort(), 5000)
如果在五秒內還沒完成請求,就會被取消。
搭配 RxJS 包裝一下或許可以讓整個 API 更方便使用。不過目前瀏覽器的支援度還沒有很好。
相關文章
- 讓你的超連結底線更好看:text-underline-offset預設的情況下底線跟文字很接近,有些設計師不喜歡這種樣式,我自己也覺得沒有很好看。
- 為什麼網頁不應該追求 Pixel Perfect只有在 Pixel Perfect 很重要的時候才應該關注他,否則往往會讓你得到一個雙輸的局面。
- 用 CSS HSL 來寫顏色吧!(以及更好的方法)在網頁開發中,傳統的 HEX 和 RGB 顏色表示法雖然廣泛使用,但存在不易閱讀和直觀性不足的問題,且在廣域的色彩空間如 P3 下表現能力受限。HSL(色相、飽和度、亮度)提供了一種更直覺的顏色定義方式,讓開發者能更輕鬆地理解與調整顏色。HSL 通過色相、飽和度和亮度三個維度來描述顏色,使得顏色的調整更加人性化,特別是在設計系統中,HSL 能更好地呈現色盤的亮度變化。
- 盡可能不設定 line-height 為 1 與 ellipsis 的原因本文探討了為何在網頁設計中不建議將 line-height 設為 1,以及使用 ellipsis 時遇到的語言問題