Description of function-queue.
This project is open to updates by its users, I ensure that PRs are relevant to the community. In other words, if you find a bug or want a new feature, please help us by becoming one of the contributors ✌️ ! See the contributing section
Please consider:
- Buying me a coffee ☕
- Supporting Simply Hexagonal on Open Collective 🏆
- Starring this repo on Github 🌟
pnpm i @simplyhexagonal/function-queue
# or
yarn add @simplyhexagonal/function-queue
# or
npm install @simplyhexagonal/function-queue
Queue multiple payloads and wait for all to complete:
import FunctionQueue, {
QueueableFunction,
} from '@simplyhexagonal/function-queue';
interface MyFnPayload {
greeting: string;
}
const myFn: QueueableFunction<MyFnPayload, string> = async ({greeting}) => {
const fnResult = `${greeting.toUpperCase()} World!`;
console.log(fnResult);
return fnResult;
};
const fnQueue = new FunctionQueue(
myFn,
{
waitTimeBetweenRuns: 100, //default
getResultTimeout: 60000, //default
maxRetries: 1, //default
cleanupResultsOlderThan: 60000, //default
}
);
fnQueue.queuePayload({greeting: 'Hello'});
fnQueue.queuePayload({greeting: 'Hey'});
fnQueue.queuePayload({greeting: 'Hi'});
fnQueue.queuePayload({greeting: 0 as any as string}); // This is bad and would obviously fail at runtime
fnQ.processQueue();
const results = await fnQ.processQueuePromise;
console.log(results);
// [
// { duration: 138, result: 'HELLO World!', ... },
// { duration: 104, result: 'HEY World!', ... }
// { duration: 104, result: 'HI World!', ... },
// {
// duration: 202,
// error: TypeError: greeting.toUpperCase is not a function
// ...
// }
// ]
Queue multiple payloads but only get the results you need:
import FunctionQueue, {
QueueableFunction,
} from '@simplyhexagonal/function-queue';
interface MyFnPayload {
greeting: string;
}
const myFn: QueueableFunction<MyFnPayload, string> = async ({greeting}) => {
const fnResult = `${greeting.toUpperCase()} World!`;
console.log(fnResult);
return fnResult;
};
const fnQueue = new FunctionQueue(myFn);
const payloadId1 = fnQueue.queuePayload({greeting: 'Hello'});
const payloadId2 = fnQueue.queuePayload({greeting: 0 as any as string}); // This is bad and would obviously fail at runtime
fnQ.processQueue();
let result;
result = await fnQ.getResult(payloadId2);
console.log(result);
// {
// duration: 202,
// error: TypeError: greeting.toUpperCase is not a function
// ...
// }
result = await fnQ.getResult(payloadId1);
console.log(result);
// { duration: 138, result: 'HELLO World!', ... },
Results that have an endTimestamp
older than the cleanupResultsOlderThan
option will be cleaned
up automatically only when fnQ.processQueue()
or fnQ.getResult(...)
are called.
If you find results getting stuck in memory for too long and would like to clean them up either
manually or periodically, you can use the fnQ.cleanupResults()
method.
Yes, thank you! This plugin is community-driven, most of its features are from different authors.
Please update the docs and tests and add your name to the package.json
file.
Thanks goes to these wonderful people (emoji key):
Jean Lescure 🚧 💻 📓 |
Copyright (c) 2021-Present Function Queue Contributors.
Licensed under the Apache License 2.0.