You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
svinokot 414dcf44d4 1.0.0 8 months ago
nbproject * init 8 months ago
public_html 1.0.0 8 months ago
src 1.0.0 8 months ago
.gitignore * init 8 months ago
LICENSE * init 8 months ago
README.md 1.0.0 8 months ago
index.js * init 8 months ago
package.json 1.0.0 8 months ago

README.md

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(...f)(x) - like y = await f[0](x); z = await f[1](y); ... f[n];
  • all(...f)(x) - like Promise.all([...f.map(fn => fn(x))])
  • put(key, f)(x) - like f(x[key]).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 scenario, like the function:

/* Create scenario */
const scenario = join(task1, task2, ..., taskn);

/* Execute scenario with various initial data */
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);

/* execute with data */
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; // Will be ignored

const scenario = join(task1, task2, { two: 'Hi!' });
scenario().then(console.log);
> { one: 'Hello!', two: 'Hi!' }

Examples

/* An function for make request, do not mind... */
const myFetch = (url) => fetch(`https://${url}`).then(response => response.json());
import { join } './task-queue.js';

/* First task needs to id */
const loadUser = (response) => {
  const { id } = response;

  return myFetch(`user/${id}`)
    .then(json => ({ user: json }));
}

/* Second task needs to wait result of first task */
const loadItems = (response) => {
  const { id, user } = response;

  return myFetch(`metadata/${id}/${user.id}`)
    .then(json => ({ items: json }));
}

/* This tasks will call consistently
   and next task will be accept previous result. */
const scenario = join(loadUser, loadItems);

Using

/* It able to various requesting */
scenario({ id: 1 }).then(setData);
// { id: 1, user: {...}, items: [] }

scenario({ id: 2 }).then(setData);
// { id: 2, user: {...}, items: [] }
...