Skip to content

a queue runner with priorities, concurrency and promises

License

Notifications You must be signed in to change notification settings

tlaziuk/asap-es

Repository files navigation

asap-es

build coverage dependencies dev-dependencies optional-dependencies peer-dependencies version downloads license maintainability

a queue runner with priorities, concurrency and promises

installation

npm install asap-es

why

The main goal is to provide lightweight and modern library for queuing tasks. The name was inspired by the asap library. There is already a few libraries with similar functionality, yet this is another one.

lib async sync concurrency priority size license
asap-es ✔️ ✔️ ✔️ ✔️ size license
asap ✖️ ✔️ ✖️ ✖️ size license
aurelia-task-queue ✔️ ✔️ ✖️ ✖️ size license
d3-queue ✔️ ✔️ ✔️ ✖️ size license
kueue ✔️ ✔️ ✖️ ✖️ size license
queue ✔️ ✔️ ✔️ ✔️ size license
run-queue ✔️ ✔️ ✔️ ✔️ size license

api

name description
new <ctor>(c) create new asap-es instance, optinal concurrency can be passed as argument
<ctor>(c) same as above
<instance>.c the number of tasks to run simultaneously (1 by default), set to < 1 to pause the queue
<instance>.q(task, priority) enqueue a new task, returns a promise which resolves or rejects when execution of the task is finished, optionally pass priority
task task is a function which may return a value or a promise (task awaits for promise completion)

usage example

import asap from "asap-es";
import delay from "asap-es/delay";
import timeout from "asap-es/timeout";

// you can have many independent queues
const queue = new asap();

// paused queue will not run tasks
const queuePaused = new asap(false);

// resume the queue by increasing concurrency
queuePaused.c++;

// promises
queue.q(() => Promise.resolve(2)).then(console.log);
// console >> 2

// pause the queue
queue.c = 0;

// async functions
queue.q(async () => {
    // do some async things
});

// task with higher priority
queue.q(() => void 0, -1);

// set concurrency and resume the queue
queue.c = 2;

// delay execution of a task by 20 ms
queue.q(delay(20, () => void 0));

// handle errors
queue.q(() => {
    throw new Error();
}).catch(console.error);
// console >> error

// timeout a task after given time
queue.q(timeout(200, () => {
    // a long task
}));

// combine delay and timeout
queue.q(delay(10, timeout(5, () => {
    // this task waits 10 ms for execution, then timeouts in 5 ms
})))