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 | undefined
。对于我正在使用的API,必须有条件地检查是否设置了signal
,这给代码增加了很多复杂性,因此了解在哪些条件下没有定义signal
对象将非常有帮助。任何想法将不胜感激。
1条答案
按热度按时间mftmpeh81#
如果
AbortController
类存在,则signal
将存在。让我们来看看源代码:addSignalProperty()
函数将signal
属性添加到查询函数上下文中,如下所示:通过
getAbortController()
函数得到abortController
这就是为什么
signal
属性的TS类型是:AbortSignal | undefined
。官方文件也提到了这一点。
AbortController
API在大多数运行时环境中都可用,但如果运行时环境不支持它,则查询函数将接收undefined
。如果您愿意,您可以选择polyfillAbortController
API,有几个可用的。