typescript - TanStack useQuery函数中的AbortSignal在什么情况下未定义?

标签 typescript fetch-api react-query

TanStack React Query ( https://tanstack.com/query/v4/docs/react/guides/query-cancellation ) 的文档解释了 queryFn 属性如何接收具有 signal 属性的对象,该属性可用于取消查询,就像这个例子一样。

const query = useQuery({
  queryKey: ['todos'],
  queryFn: async ({ signal }) => {
    const todosResponse = await fetch('/todos', {
      signal,
    })
    const todos = await todosResponse.json()
    const todoDetails = todos.map(async ({ details }) => {
      const response = await fetch(details, {
        signal,
      })
      return response.json()
    })

    return Promise.all(todoDetails)
  },
})

问题是,使用 TypeScript,此信号属性的类型为 AbortSignal |未定义。对于我正在使用的 API,必须有条件地检查 signal 是否已设置,这会增加代码的复杂性,因此了解此 signal 在什么条件下会非常有帮助 对象未定义。任何想法将不胜感激。

最佳答案

react-query v4.29.11

如果 AbortController信号将存在类存在。我们看一下源码:

signal 属性通过 addSignalProperty() 添加到查询函数上下文中函数,见下图:

    const addSignalProperty = (object: unknown) => {
      Object.defineProperty(object, 'signal', {
        enumerable: true,
        get: () => {
          if (abortController) {
            this.abortSignalConsumed = true
            return abortController.signal
          }
          return undefined
        },
      })
    }

    addSignalProperty(queryFnContext)

abortControllergetAbortController() 获取功能

export function getAbortController(): AbortController | undefined {
  if (typeof AbortController === 'function') {
    return new AbortController()
  }
  return
}

这就是为什么signal属性的TS类型是:AbortSignal |未定义

官方文档也提到了。

The AbortController API is available in most runtime environments, but if the runtime environment does not support it then the query function will receive undefined in its place. You may choose to polyfill the AbortController API if you wish, there are several available.

关于typescript - TanStack useQuery函数中的AbortSignal在什么情况下未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76356388/

相关文章:

typescript - 如何制作类型安全的泛型函数

javascript - 错误 TypeError : Cannot read property '1' of null at Object. eval [作为 updateDirectives]

javascript - try..catch 没有捕捉到异步/等待错误

reactjs - 如何从其他组件访问 useQuery refetch 方法?

reactjs - ReactQuery - useInfiniteQuery 重新获取问题

javascript - 如何告诉 typescript ,那个过程不是未定义的?

javascript - Typescript 类型保护返回值存在

javascript - fetch api 不发送数据

ajax - HTTP 请求返回状态码 0 是什么意思?

reactjs - React-Query 使组件重新渲染多次