根据发送网络请求的 API 不同,取消方法不同。
常用的网络请求有如下三种:
XHR
Fetch
Axios
根据不同的网络请求方式,有对应不同的取消方法,下面来看看如何操作。
如果使用 XMLHttpRequest
发送请求可以使用 XMLHttpRequest.abort()
:
const xhr = new XMLHttpRequest()
xhr.open('GET', 'https://jsonplaceholder.typicode.com/todos/1', true)
xhr.send()
// 取消发送请求
xhr.abort()
使用 fetch
发送请求可以使用 AbortController
。
AbortController
不仅可以取消 Fetch 请求发送,同样也可以取消事件的监听(通过addEventListener
的第三个参数signal
控制)。
- 发送请求时,使用一个
signal
选项控制 fetch 请求 - 使用
abort()
方法取消请求的发送
const controller = new AbortController()
const signal = controller.signal
// 调用 abort 时触发
signal.addEventListener('abort', () => alert('abort!'))
fetch('https://jsonplaceholder.typicode.com/todos/1', {
signal
})
.then((response) => response.json())
.then((json) => console.log(json))
controller.abort()
// 事件触发,signal.aborted 变为 true
alert(signal.aborted) // true
Axios 中通过 CancelToken
取消请求发送:
const CancelToken = axios.CancelToken
const source = CancelToken.source()
axios.get('https://jsonplaceholder.typicode.com/todos/1', {
cancelToken: source.token
})
// 取消请求(消息参数是可选的)
source.cancel('用户已取消操作')
也可以通过调用 CancelToken
的构造函数来创建 CancelToken
:
const CancelToken = axios.CancelToken
let cancel
axios.get('https://jsonplaceholder.typicode.com/todos/1', {
cancelToken: new CancelToken((c) => {
cancel = c
})
})
cancel() // 取消请求
对于浏览器环境,Axios 底层使用 XMLHttpRequest
对象来发起 HTTP 请求。它使用基于 XHR 的 xhr.abort()
方法取消请求,详见源码。
对于 Node.js 环境,Axios 底层使用 HTTP/HTTPS
模块对象来发起 HTTP 请求。使用 request.abort()
,详见源码。