notifyManager 处理 Tanstack Query 中的调度和批处理回调。
它公开了以下方法:
batch 可用于批处理在传递的回调内部调度的所有更新。 这主要在内部用于优化 queryClient 更新。
function batch<T>(callback: () => T): T
function batch<T>(callback: () => T): T
batchCalls 是一个高阶函数,它接受一个回调并将其包装起来。 对包装函数的所有调用都会将回调调度到下一个批次中运行。
type BatchCallsCallback<T extends Array<unknown>> = (...args: T) => void
function batchCalls<T extends Array<unknown>>(
callback: BatchCallsCallback<T>,
): BatchCallsCallback<T>
type BatchCallsCallback<T extends Array<unknown>> = (...args: T) => void
function batchCalls<T extends Array<unknown>>(
callback: BatchCallsCallback<T>,
): BatchCallsCallback<T>
schedule 将一个函数调度到下一个批次中运行。默认情况下,批次使用 setTimeout 运行,但这可以配置。
function schedule(callback: () => void): void
function schedule(callback: () => void): void
setNotifyFunction 覆盖通知函数。此函数在应执行时传递 回调。默认的 notifyFunction 只是调用它。
例如,这可用于在运行测试时使用 React.act 包装通知:
import { notifyManager } from '@tanstack/react-query'
import { act } from 'react-dom/test-utils'
notifyManager.setNotifyFunction(act)
import { notifyManager } from '@tanstack/react-query'
import { act } from 'react-dom/test-utils'
notifyManager.setNotifyFunction(act)
setBatchNotifyFunction 设置用于批处理更新的函数
如果您的框架支持自定义批处理函数,您可以通过调用 notifyManager.setBatchNotifyFunction 来让 TanStack Query 知道。
例如,这是在 solid-query 中设置批处理函数的方式:
import { notifyManager } from '@tanstack/query-core'
import { batch } from 'solid-js'
notifyManager.setBatchNotifyFunction(batch)
import { notifyManager } from '@tanstack/query-core'
import { batch } from 'solid-js'
notifyManager.setBatchNotifyFunction(batch)
setScheduler 配置一个自定义回调,该回调应在下一个 批次运行时调度。默认行为是 setTimeout(callback, 0)。
import { notifyManager } from '@tanstack/react-query'
// 在下一个微任务中调度批次
notifyManager.setScheduler(queueMicrotask)
// 在渲染下一帧之前调度批次
notifyManager.setScheduler(requestAnimationFrame)
// 在将来的某个时间调度批次
notifyManager.setScheduler((cb) => setTimeout(cb, 10))
import { notifyManager } from '@tanstack/react-query'
// 在下一个微任务中调度批次
notifyManager.setScheduler(queueMicrotask)
// 在渲染下一帧之前调度批次
notifyManager.setScheduler(requestAnimationFrame)
// 在将来的某个时间调度批次
notifyManager.setScheduler((cb) => setTimeout(cb, 10))