80% 的前端都不知道 AbortController 究竟有多么強大!
最近發現很多人其實都沒用過一個原生的很強大的 API,那就是 AbortController ,可能很多人在用 axios 的時候用過這個 API 來 中斷請求,但是其實大部分人不知道,其實 AbortController 不止能用來做這些,它非常強大!
AbortController 的基本用法如下:
- signal: 打上標記
- abort: 執行中斷
圖片
中斷請求 & 請求超時
AbortController 的可以用來中斷請求,大家都知道,但是都是通過 axios,那么原生的請求怎么中斷呢?其實 axios 也是基于原生請求封裝的嘛!
fetch 請求時可以接收一個 signal 的參數,打上標記,并且通過這個標記所屬的實例來進行中斷。
圖片
如果你不想手動去取消請求,而是想做自動的 請求超時,你可以使用 AbortSignal.timeout。
圖片
事件監聽中斷
事件監聽 是很常見的場景,我們需要使用 addEventListener 去給目標元素綁定事件,并且需要使用 removeEventListener 去中斷這些監聽。
圖片
但是其實很多人都不知道,addEventListener 其實可以傳入第三個參數,第三個參數可以傳入一個對象,這個對象中可以傳入一個 signal 的屬性,當做中斷的標記。
圖片
所以 AbortController 也可以用在這里,用來中斷事件監聽,你可以選擇用多個 AbortController 實例來分別取消事件的監聽
圖片
你也可以用同一個 AbortController 實例來取消所有的事件監聽
圖片
發布訂閱
我們可以監聽到 abort 的執行,需要對 controller.signal 進行監聽 abort 事件
圖片
所以其實我們可以通過這個特性,讓 AbortController 來充當 發布訂閱 的作用
圖片
AbortSignal.any
有時候,你的中斷條件只依賴于一個 AbortController,而有時候,一個中斷條件需要依賴多個 AbortController 來決定,那應該咋做呢?貌似我們剛剛的 signal 只能傳入一個。
其實,確實只能傳入一個,但是我們可以將多個組合成一個,來傳入,就像是 Promise.all、Promise.race、Promise.any 那樣。
而在這里我們可以使用 AbortSignal.any。
圖片
兼容性