The notifyManager handles scheduling and batching callbacks in Tanstack Query.
It exposes the following methods:
batch can be used to batch all updates scheduled inside the passed callback. This is mainly used internally to optimize queryClient updating.
function batch<T>(callback: () => T): T
function batch<T>(callback: () => T): T
batchCalls is a higher-order function that takes a callback and wraps it. All calls to the wrapped function schedule the callback to be run on the next batch.
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 schedules a function to be run on the next batch. By default, the batch is run with a setTimeout, but this can be configured.
function schedule(callback: () => void): void
function schedule(callback: () => void): void
setNotifyFunction overrides the notify function. This function is passed the callback when it should be executed. The default notifyFunction just calls it.
This can be used to for example wrap notifications with React.act while running tests:
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 sets the function to use for batched updates
If your framework supports a custom batching function, you can let TanStack Query know about it by calling notifyManager.setBatchNotifyFunction.
For example, this is how the batch function is set in 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 configures a custom callback that should schedules when the next batch runs. The default behaviour is setTimeout(callback, 0).
import { notifyManager } from '@tanstack/react-query'
// Schedule batches in the next microtask
notifyManager.setScheduler(queueMicrotask)
// Schedule batches before the next frame is rendered
notifyManager.setScheduler(requestAnimationFrame)
// Schedule batches some time in the future
notifyManager.setScheduler((cb) => setTimeout(cb, 10))
import { notifyManager } from '@tanstack/react-query'
// Schedule batches in the next microtask
notifyManager.setScheduler(queueMicrotask)
// Schedule batches before the next frame is rendered
notifyManager.setScheduler(requestAnimationFrame)
// Schedule batches some time in the future
notifyManager.setScheduler((cb) => setTimeout(cb, 10))