use-async-queue
TypeScript icon, indicating that this package has built-in type declarations

2.1.5 • Public • Published

use-async-queue

A React Hook implementing a queue for sync or async tasks, with optional concurrency limit.

Inspired by @caolan/async.queue.

Usage

  • Create a queue with some concurrency. Default concurrency is 8. Set to Infinity or less than 1 for no concurrency limit.
  • Register for notifications as tasks are processed and finished.
  • Add tasks to it. A task is an object with an id (some unique value that makes sense for your use case -- a number, a url, etc.) and a task (a function that returns a Promise).
  • Demo: https://codesandbox.io/s/use-async-queue-demo-53y89
import useAsyncQueue from 'use-async-queue';

// Example shows a task fetching a url, but a task can be any operation.
const url = 'some url';

const inflight = task => {
  console.log(`starting ${task.id}`);
  console.dir(stats); // { numPending: 0, numInFlight: 1, numDone: 0}
};

const done = async task => {
  const result = await task.result;
  console.log(`finished ${task.id}: ${result}`);
  console.dir(stats); // { numPending: 0, numInFlight: 0, numDone: 1}
};

const drain = () => {
  console.log('all done');
  console.dir(stats); // { numPending: 0, numInFlight: 0, numDone: 1}
};

const { add, stats } = useAsyncQueue({
  concurrency: 1,
  inflight,
  done,
  drain,
});

add({
  id: url,
  task: () => {
    return fetch(url).then(res => res.text());
  },
});
console.dir(stats); // { numPending: 1, numInFlight: 0, numDone: 0}

TODO

  • [x] return numInFlight, numRemaining, numDone
  • [x] catch
  • [x] pending/inflight
  • [x] inflight callback
  • [x] drain callback
  • [ ] timeouts
  • [ ] start, stop methods
  • [ ] use events instead of/in addition to callbacks

Package Sidebar

Install

npm i use-async-queue

Weekly Downloads

3,620

Version

2.1.5

License

ISC

Unpacked Size

29.7 kB

Total Files

17

Last publish

Collaborators

  • ixldss
  • spanishdict_eng
  • sandinmyjoints