@alwatr/async-queue
Version:
A queue that executes async tasks in order like mutex and semaphore methodology for javascript and typescript.
53 lines (39 loc) • 1.59 kB
JavaScript
import {AsyncQueue} from '@alwatr/async-queue';
describe('AsyncQueue', () => {
let queue;
beforeEach(() => {
queue = new AsyncQueue();
});
it('should queue tasks and execute them in order', async () => {
const results = [];
const task = (/** @type {number} */ id) => async () => {
await new Promise((resolve) => setTimeout(resolve, 10));
results.push(id);
};
queue.push('task1', task(1));
queue.push('task2', task(2));
await queue.push('task3', task(3));
expect(results).toEqual([1, 2, 3]);
queue.push('task3', task(4));
queue.push('task3', task(5));
await queue.waitForFinish('task3');
expect(results).toEqual([1, 2, 3, 4, 5]);
});
it('should return true for running tasks', async () => {
queue.push('task1', async () => {});
expect(queue.isRunning('task1')).toBe(true);
});
it('should return false for finished tasks', async () => {
await queue.push('task1', async () => {});
expect(queue.isRunning('task1')).toBe(false);
});
it('should wait for all tasks to finish', async () => {
queue.push('task1', async () => new Promise((resolve) => setTimeout(resolve, 11, 1)));
queue.push('task2', async () => new Promise((resolve) => setTimeout(resolve, 12, 2)));
queue.push('task3', async () => new Promise((resolve) => setTimeout(resolve, 13, 3)));
expect(await queue.waitForAllFinish()).toEqual([1, 2, 3]);
expect(queue.isRunning('task1')).toBe(false);
expect(queue.isRunning('task2')).toBe(false);
expect(queue.isRunning('task3')).toBe(false);
});
});