Skip to content

cancellableFetch

创建一个可以随时取消的网络请求,使用 AbortController 实现取消功能。

前置依赖

依赖参数

参数名类型说明
deps.fetchFetchFunctionFetch API 函数
deps.AbortControllertypeof AbortControllerAbortController 构造函数

环境要求

  • 浏览器环境: 需要支持 fetchAbortController API(现代浏览器均支持)

函数签名

typescript
function cancellableFetch(
  input: RequestInfo | URL,
  init?: RequestInit,
  deps: CancellableFetchDeps
): CancellableFetchResult

interface CancellableFetchDeps {
  fetch: FetchFunction
  AbortController: typeof AbortController
}

interface CancellableFetchResult {
  promise: Promise<Response>
  cancel: (reason?: any) => void
  signal: AbortSignal
}

参数

参数名类型必填说明
inputRequestInfo | URL请求 URL 或 Request 对象
initRequestInit请求配置选项(会自动添加 signal)
deps.fetchFetchFunctionFetch API 函数
deps.AbortControllertypeof AbortControllerAbortController 构造函数

返回值

类型说明
CancellableFetchResult包含 promisecancel 方法和 signal 的对象

CancellableFetchResult 属性

属性名类型说明
promisePromise<Response>请求的 Promise
cancel(reason?: any) => void取消请求的方法
signalAbortSignal取消信号对象

工作原理

  1. 创建 AbortController

    • 使用传入的 AbortController 构造函数创建控制器
    • 获取 AbortSignal 信号对象
  2. 合并请求配置

    • 如果用户提供了自定义 signal,则使用用户的 signal
    • 否则使用新创建的 signal
    • signal 添加到请求配置中
  3. 发起请求

    • 使用 fetch 函数发起网络请求
    • 返回包含 promisecancel 方法和 signal 的对象
  4. 取消请求

    • 调用 cancel() 方法会触发 AbortController.abort()
    • fetch 会检测到 signal 被中止,抛出 AbortError
    • Promise 会 reject,错误类型为 DOMException,名称为 AbortError

注意事项

  • 如果用户提供了自定义 signalcancel() 方法不会生效(因为无法控制用户的 AbortController
  • cancel() 方法具有幂等性,可以多次调用而不会报错
  • 取消后的 Promise 会 reject,需要使用 catch 处理错误
  • 应该区分 AbortError(取消)和网络错误