You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TanStack Query为何取消首个查询并重新发起?

问题:含forceUpdate参数的查询被无故取消

我通过Context管理查询逻辑,用户点击“更新全部数据”按钮时,会向查询添加forceUpdate参数(格式类似address?forceUpdate=唯一值),但带有该参数的查询被无故取消,无法定位原因。即使移除forceUpdate参数,问题依旧,查询取消原因显示为“无原因”。

相关代码逻辑

1. 更新forceUpdate的处理函数

const forceUpdateHandler = async () => {
    await queryClient.cancelQueries([QueryKeys.DATA_FROM], { exact: false })
    setForceUpdate(v4())
}

2. 传入forceUpdate的Context Provider

<QueryParametersContextProvider
      forceUpdate={forceUpdate}
      startArgs={startArgs}
      value={{
        queryParameters: new Map(dashboardParams?.queryParameters),
        applyQueryParameter: (param) => applyParameters({ queryParameters: param }),
        removeQueryParameter: removeParameter,
        forceUpdate
      }}>
</QueryParametersContextProvider>

3. 处理forceUpdate参数的自定义Hook

export const useQueryParams = (paramsForObserve?: Partial<IHashParameter>[]): UseQueryParamsResult => {

// other code with other logic
  const context = useContext(QueryParametersContext)

  const prevUpdate = useDeferredValue(context.forceUpdate)

  const parameters = useMemo<QueryParameters>(() => {
    const initQueryParams: QueryParameters = paramsForObserve?.some(p => p?.key === ReservedKeys.expanded) ?
      new Map([[ReservedKeys.expanded, fullScreen]]) :
      new Map()

    const observableParams = paramsForObserve?.reduce((prev, curr) => {
      return curr?.key !== ReservedKeys.expanded
        ? new Map(prev.set(curr?.key, context.queryParameters?.get(curr?.key)))
        : prev
    }, initQueryParams as QueryParameters)

    if (prevUpdate !== context.forceUpdate) {
      const baseParamsForUpdate = new Map(reservedParams.reduce((prev, curr) => prev.set(curr, context.queryParameters.get(curr)), initQueryParams))
      const result = new Map([...Array.from(baseParamsForUpdate), ...Array.from(observableParams ?? []), [ReservedKeys.forceUpdate, context.forceUpdate]])
      return result
    }

    return observableParams

  }, [context.queryParameters, paramsForObserve, context.forceUpdate, fullScreen])

  return [
    parameters, applyParameters, removeParameter, getParametersByKey
  ]
}

4. 数据查询逻辑

const dataQueryKey = useMemo(() => [QueryKeys.DATA_FROM, object, view,
  ...parametersForHash?.map(({ key, value }) =>
    `${key}=${typeof value === 'object'
      ? JSON.stringify(value)
      : value}`)]
    , [parametersForHash])

  const dataQuery = useMemo(() => ({
    queryKey: dataQueryKey,
    queryFn: fetchDataFromSource(parameters)({ object, view }),
    ...defaultQueryConfig,
    enabled: (!loadingObservablegQP || !useQueryParameters) && !!object && enable,
    refetchOnMount: false,
    retryOnMount: false,
    refetchInterval: interval,
    refetchIntervalInBackground: true,
  }), [dataQueryKey, loadingObservablegQP, parametersForHash])


  const data = useQuery(dataQuery)

补充信息

点击“更新全部数据”后的网络请求截图显示查询被取消。


内容的提问来源于stack exchange,提问作者psukitp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:34:51