Task-queue-js
Library for organizing client API based on Set theory.
Installation
- Git
git clone http://git.vovikilelik.com/Clu/task-queue-js.git
- Npm
npm i @vovikilelik/task-queue-js
Using
import { join, all, put } './task-queue.js';
Base scenarios
join(...tasks)(x)
- like y = await task1(x); z = await task2(y); n = await taskn(z); ...
;
all(...tasks)(x)
- like Promise.all([...tasks.map(task => task(x))])
;
put(key, task)(x)
- like task(x).then(a => ({ [key]: a }))
.
Each scenario does not call requests immediately after creation, but only creates a script described in ...tasks
.
In order for the request has been executed, you need to call the ready-made aggregator, like the function:
const scenario = join(task1, task2, task3, ...);
scenario(initData).then(...).catch(...);
Each task
is a function that takes the result of the previous task
and returns a Promise
.
const task = (data) => doPromise(data);
const scenario = join(task);
scenario(data);
The result of the task
will merged to the result of the previous one. It can complement the previous object or overwrite some of the fields.
const task = (prev) => makeRequest(prev).then(items => ({ items }));
join(task)({ id: 1 }).then(console.log);
> { id: 1, items: [] }
Scenarios and tasks can be combined, and conditions can be specified directly when declaring arguments:
join(
all(
join(
all(),
...
),
),
isValid() && task
);
If there is no need for requests to the server, you can immediately transfer the finished data, both in scripts and in tasks, or return nothing:
const task1 = () => ({ one: 'Hello!' });
const task2 = () => false;
const scenario = join(task1, task2, { two: 'Hi!' });
scenario().then(console.log);
> { one: 'Hello!', two: 'Hi!' }
Examples
const myFetch = (url) => fetch(`https://${url}`).then(response => response.json());
import { join } './task-queue.js';
const loadUser = (response) => {
const { id } = response;
return myFetch(`user/${id}`)
.then(json => ({ user: json }));
}
const loadItems = (response) => {
const { id, user } = response;
return myFetch(`metadata/${id}/${user.id}`)
.then(json => ({ items: json }));
}
const scenario = join(loadUser, loadItems);
Using
scenario({ id: 1 }).then(setData);
scenario({ id: 2 }).then(setData);
...