function useAsyncBatcher<TValue, TSelected>( fn, options, selector): ReactAsyncBatcher<TValue, TSelected>; function useAsyncBatcher<TValue, TSelected>( fn, options, selector): ReactAsyncBatcher<TValue, TSelected>; Defined in: react-pacer/src/async-batcher/useAsyncBatcher.ts:170
A React hook that creates an AsyncBatcher instance for managing asynchronous batches of items.
This is the async version of the useBatcher hook. Unlike the sync version, this async batcher:
Features:
The batcher collects items and processes them in batches based on:
Error Handling:
The hook uses TanStack Store for reactive state management. The selector parameter allows you to specify which state changes will trigger a re-render, optimizing performance by preventing unnecessary re-renders when irrelevant state changes occur.
By default, there will be no reactive state subscriptions and you must opt-in to state tracking by providing a selector function. This prevents unnecessary re-renders and gives you full control over when your component updates. Only when you provide a selector will the component re-render when the selected state values change.
Available state properties:
TValue
TSelected = { }
(items) => Promise<any>
AsyncBatcherOptions<TValue> = {}
(state) => TSelected
ReactAsyncBatcher<TValue, TSelected>
// Basic async batcher for API requests - no reactive state subscriptions const asyncBatcher = useAsyncBatcher( async (items) => { const results = await Promise.all(items.map(item => processItem(item))); return results; }, { maxSize: 10, wait: 2000 } ); // Opt-in to re-render when execution state changes (optimized for loading indicators) const asyncBatcher = useAsyncBatcher( async (items) => { const results = await Promise.all(items.map(item => processItem(item))); return results; }, { maxSize: 10, wait: 2000 }, (state) => ({ isExecuting: state.isExecuting, isPending: state.isPending, status: state.status }) ); // Opt-in to re-render when results are available (optimized for data display) const asyncBatcher = useAsyncBatcher( async (items) => { const results = await Promise.all(items.map(item => processItem(item))); return results; }, { maxSize: 10, wait: 2000 }, (state) => ({ lastResult: state.lastResult, successCount: state.successCount, totalItemsProcessed: state.totalItemsProcessed }) ); // Opt-in to re-render when error state changes (optimized for error handling) const asyncBatcher = useAsyncBatcher( async (items) => { const results = await Promise.all(items.map(item => processItem(item))); return results; }, { maxSize: 10, wait: 2000, onError: (error) => console.error('Batch processing failed:', error) }, (state) => ({ errorCount: state.errorCount, failedItems: state.failedItems, totalItemsFailed: state.totalItemsFailed }) ); // Complete example with all callbacks const asyncBatcher = useAsyncBatcher( async (items) => { const results = await Promise.all(items.map(item => processItem(item))); return results; }, { maxSize: 10, wait: 2000, onSuccess: (result) => { console.log('Batch processed successfully:', result); }, onError: (error) => { console.error('Batch processing failed:', error); } } ); // Add items to batch asyncBatcher.addItem(newItem); // Manually execute batch const result = await asyncBatcher.execute(); // Access the selected state (will be empty object {} unless selector provided) const { isExecuting, lastResult, size } = asyncBatcher.state; // Basic async batcher for API requests - no reactive state subscriptions const asyncBatcher = useAsyncBatcher( async (items) => { const results = await Promise.all(items.map(item => processItem(item))); return results; }, { maxSize: 10, wait: 2000 } ); // Opt-in to re-render when execution state changes (optimized for loading indicators) const asyncBatcher = useAsyncBatcher( async (items) => { const results = await Promise.all(items.map(item => processItem(item))); return results; }, { maxSize: 10, wait: 2000 }, (state) => ({ isExecuting: state.isExecuting, isPending: state.isPending, status: state.status }) ); // Opt-in to re-render when results are available (optimized for data display) const asyncBatcher = useAsyncBatcher( async (items) => { const results = await Promise.all(items.map(item => processItem(item))); return results; }, { maxSize: 10, wait: 2000 }, (state) => ({ lastResult: state.lastResult, successCount: state.successCount, totalItemsProcessed: state.totalItemsProcessed }) ); // Opt-in to re-render when error state changes (optimized for error handling) const asyncBatcher = useAsyncBatcher( async (items) => { const results = await Promise.all(items.map(item => processItem(item))); return results; }, { maxSize: 10, wait: 2000, onError: (error) => console.error('Batch processing failed:', error) }, (state) => ({ errorCount: state.errorCount, failedItems: state.failedItems, totalItemsFailed: state.totalItemsFailed }) ); // Complete example with all callbacks const asyncBatcher = useAsyncBatcher( async (items) => { const results = await Promise.all(items.map(item => processItem(item))); return results; }, { maxSize: 10, wait: 2000, onSuccess: (result) => { console.log('Batch processed successfully:', result); }, onError: (error) => { console.error('Batch processing failed:', error); } } ); // Add items to batch asyncBatcher.addItem(newItem); // Manually execute batch const result = await asyncBatcher.execute(); // Access the selected state (will be empty object {} unless selector provided) const { isExecuting, lastResult, size } = asyncBatcher.state; 