client-run-queue
This package provides a RunQueue implementation for scheduling and managing async or time-consuming functions such that client-side interactivity disruptions are minimized.
Usage Examples
Try it Out – CodeSandbox
import { CANCELED, DEFAULT_PRIORITY, RunQueue } from 'client-run-queue';
const main = async () => {
const q = new RunQueue('my-queue');
const doSomeWork = async () => {
await new Promise((resolve) => setTimeout(resolve, Math.random() * 1000));
return Math.random();
};
const entry = q.schedule(DEFAULT_PRIORITY, 'my-function', doSomeWork);
console.log('canceled', entry.wasCanceled());
console.log('completed', entry.wasCompleted());
console.log('started', entry.wasStarted());
const result = await entry.promise;
if (result.ok) {
console.log('success', result.details);
} else if (result.details === CANCELED) {
console.log('canceled');
} else {
console.log('failure', result.details);
}
q.schedule(2, 'my-function', doSomeWork, { delayMSec: 1000 });
q.schedule(0, 'my-function', doSomeWork, { neverCancel: true });
q.schedule(1, 'my-function', doSomeWork);
console.log('queue length', q.getQueueLength());
q.cancelAll();
};
main();
Configuration
With RunQueue, one can specify:
- max parallelism
- max work units and/or continuous work duration per loop iteration
- priority and cancellable per entry (runnable function)
You may then:
- check the status of entries
- request cancellation of specific or all entries
- wait for the promised values of entries
In addition to configuring individual RunQueues in the ways mentioned above, you may also specify:
- a runAfterInteractions function to customize the coordinated scheduling mechanism for your environment (ex. React Native uses
InteractionManager.runAfterInteractions
). See setRunAfterInteractions
. By default, runAfterInteractions
uses a 0ms timeout. - Stats tracking functions for debugging and analyzing usage. See
setStatsHandler
.
React Native
As noted above, for React Native, it's recommended to use InteractionManager
for runAfterInteractions
. To do that, run code like the following, early in your programs execution:
setRunAfterInteractions((_id, func) => {
const handle = InteractionManager.runAfterInteractions(func);
return handle.cancel;
})
API Docs
Thanks
Thanks for checking it out. Feel free to create issues or otherwise provide feedback.
Be sure to check out our other TypeScript OSS projects as well.