跳到主要内容

Axios 取消请求

在 axios 调用时设置 timeout 属性可处理与响应相关的超时。

在某些情况下(例如,网络连接不可用),取消 Axios 调用可以更早地中断连接,提高性能。如果不使用取消操作,Axios 调用可能会一直挂起,直到父级代码/栈超时(在服务器端应用中可能需要几分钟)。

要终止 axios 的调用,你可以使用以下方法:

  • signal
  • cancelToken (已弃用)

结合超时和取消方法(例如 signal)应该涵盖与响应相关的超时和与连接相关的超时。

signal :AbortController

v0.22.0 开始,Axios 支持 AbortController 以 fetch API 方式取消请求:

const controller = new AbortController()

axios
.get("/foo/bar", {
signal: controller.signal
})
.then(function (response) {
//...
})
// 取消请求
controller.abort()

使用最新 AbortSignal.timeout() API [nodejs 17.3+] 的超时示例:

axios
.get("/foo/bar", {
signal: AbortSignal.timeout(5000) // 在 5 秒后中止请求
})
.then(function (response) {
//...
})

带有超时辅助函数的示例:

function newAbortSignal(timeoutMs) {
const abortController = new AbortController()
setTimeout(() => abortController.abort(), timeoutMs || 0)

return abortController.signal
}

axios
.get("/foo/bar", {
signal: newAbortSignal(5000) // 在 5 秒后中止请求
})
.then(function (response) {
//...
})

CancelToken deprecated

你还可以使用 CancelToken 取消请求。

  • Axios 的 cancel token API 是基于被撤销的 cancelable promises proposal 提案

  • 此 API 从 v0.22.0 开始已被弃用,不应在新项目中使用。

你可以使用 CancelToken.source 工厂方法创建一个 cancel token ,如下所示:

const CancelToken = axios.CancelToken
const source = CancelToken.source()

axios
.get("/user/12345", {
cancelToken: source.token
})
.catch(function (thrown) {
if (axios.isCancel(thrown)) {
console.log("Request canceled", thrown.message)
} else {
// 处理错误
}
})

axios.post(
"/user/12345",
{
name: "new name"
},
{
cancelToken: source.token
}
)

// 取消请求(message 参数是可选的)
source.cancel("Operation canceled by the user.")

也可以通过传递一个 executor 函数到 CancelToken 的构造函数来创建一个 cancel token:

const CancelToken = axios.CancelToken
let cancel

axios.get("/user/12345", {
cancelToken: new CancelToken(function executor(c) {
// executor 函数接收一个 cancel 函数作为参数
cancel = c
})
})

// 取消请求
cancel()
提示

注意: 你可以使用相同的 cancel token 或 signal 取消多个请求。

在过渡期间,你可以使用这两个取消 API 请求,即使对于同一请求也是如此:

const controller = new AbortController()

const CancelToken = axios.CancelToken
const source = CancelToken.source()

axios
.get("/user/12345", {
cancelToken: source.token,
signal: controller.signal
})
.catch(function (thrown) {
if (axios.isCancel(thrown)) {
console.log("Request canceled", thrown.message)
} else {
// 处理错误
}
})

axios.post(
"/user/12345",
{
name: "new name"
},
{
cancelToken: source.token
}
)

// 取消请求 (message 参数是可选的)
source.cancel("Operation canceled by the user.")
// 或
controller.abort() // 不支持 message 参数