function useAsyncQueuer<TValue, TSelected>( fn, options, selector): ReactAsyncQueuer<TValue, TSelected>
function useAsyncQueuer<TValue, TSelected>( fn, options, selector): ReactAsyncQueuer<TValue, TSelected>
Defined in: react-pacer/src/async-queuer/useAsyncQueuer.ts:167
A lower-level React hook that creates an AsyncQueuer instance for managing an async queue of items.
Features:
Tasks are processed concurrently up to the configured concurrency limit. When a task completes, the next pending task is processed if below the concurrency limit.
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 = {}
(value) => Promise<any>
AsyncQueuerOptions<TValue> = {}
(state) => TSelected
ReactAsyncQueuer<TValue, TSelected>
// Default behavior - no reactive state subscriptions const asyncQueuer = useAsyncQueuer( async (item) => { const result = await processItem(item); return result; }, { concurrency: 2, maxSize: 100, started: false } ); // Opt-in to re-render when queue size changes (optimized for displaying queue length) const asyncQueuer = useAsyncQueuer( async (item) => { const result = await processItem(item); return result; }, { concurrency: 2, maxSize: 100, started: false }, (state) => ({ size: state.size, isEmpty: state.isEmpty, isFull: state.isFull }) ); // Opt-in to re-render when processing state changes (optimized for loading indicators) const asyncQueuer = useAsyncQueuer( async (item) => { const result = await processItem(item); return result; }, { concurrency: 2, maxSize: 100, started: false }, (state) => ({ isRunning: state.isRunning, isIdle: state.isIdle, status: state.status, activeItems: state.activeItems, pendingTick: state.pendingTick }) ); // Opt-in to re-render when execution metrics change (optimized for stats display) const asyncQueuer = useAsyncQueuer( async (item) => { const result = await processItem(item); return result; }, { concurrency: 2, maxSize: 100, started: false }, (state) => ({ successCount: state.successCount, errorCount: state.errorCount, settledCount: state.settledCount, expirationCount: state.expirationCount, rejectionCount: state.rejectionCount }) ); // Opt-in to re-render when results are available (optimized for data display) const asyncQueuer = useAsyncQueuer( async (item) => { const result = await processItem(item); return result; }, { concurrency: 2, maxSize: 100, started: false, onSuccess: (result) => { console.log('Item processed:', result); }, onError: (error) => { console.error('Processing failed:', error); } }, (state) => ({ lastResult: state.lastResult, successCount: state.successCount }) ); // Add items to queue asyncQueuer.addItem(newItem); // Start processing asyncQueuer.start(); // Access the selected state (will be empty object {} unless selector provided) const { size, isRunning, activeItems } = asyncQueuer.state;
// Default behavior - no reactive state subscriptions const asyncQueuer = useAsyncQueuer( async (item) => { const result = await processItem(item); return result; }, { concurrency: 2, maxSize: 100, started: false } ); // Opt-in to re-render when queue size changes (optimized for displaying queue length) const asyncQueuer = useAsyncQueuer( async (item) => { const result = await processItem(item); return result; }, { concurrency: 2, maxSize: 100, started: false }, (state) => ({ size: state.size, isEmpty: state.isEmpty, isFull: state.isFull }) ); // Opt-in to re-render when processing state changes (optimized for loading indicators) const asyncQueuer = useAsyncQueuer( async (item) => { const result = await processItem(item); return result; }, { concurrency: 2, maxSize: 100, started: false }, (state) => ({ isRunning: state.isRunning, isIdle: state.isIdle, status: state.status, activeItems: state.activeItems, pendingTick: state.pendingTick }) ); // Opt-in to re-render when execution metrics change (optimized for stats display) const asyncQueuer = useAsyncQueuer( async (item) => { const result = await processItem(item); return result; }, { concurrency: 2, maxSize: 100, started: false }, (state) => ({ successCount: state.successCount, errorCount: state.errorCount, settledCount: state.settledCount, expirationCount: state.expirationCount, rejectionCount: state.rejectionCount }) ); // Opt-in to re-render when results are available (optimized for data display) const asyncQueuer = useAsyncQueuer( async (item) => { const result = await processItem(item); return result; }, { concurrency: 2, maxSize: 100, started: false, onSuccess: (result) => { console.log('Item processed:', result); }, onError: (error) => { console.error('Processing failed:', error); } }, (state) => ({ lastResult: state.lastResult, successCount: state.successCount }) ); // Add items to queue asyncQueuer.addItem(newItem); // Start processing asyncQueuer.start(); // Access the selected state (will be empty object {} unless selector provided) const { size, isRunning, activeItems } = asyncQueuer.state;
Your weekly dose of JavaScript news. Delivered every Monday to over 100,000 devs, for free.
Your weekly dose of JavaScript news. Delivered every Monday to over 100,000 devs, for free.