# TaskQueue
**Repository Path**: DieHunter/task-queue
## Basic Information
- **Project Name**: TaskQueue
- **Description**: nodejs消息队列
- **Primary Language**: TypeScript
- **License**: GPL-2.0
- **Default Branch**: master
- **Homepage**: https://www.npmjs.com/package/task-queue-lib
- **GVP Project**: No
## Statistics
- **Stars**: 6
- **Forks**: 0
- **Created**: 2022-05-09
- **Last Updated**: 2024-11-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: TypeScript, JavaScript
## README
# TaskQueue
任务队列
## 介绍
nodejs 任务队列, 针对请求、IO 操作或其他异步操作高并发削峰的解决方案
## 调试说明
1. pnpm build(构建)
2. pnpm example(示例)
3. pnpm debug(调试源码)
## 用法介绍
### 安装依赖
`npm install task-queue-lib`
或
`yarn add task-queue-lib`
或
`pnpm install task-queue-lib`
### 引入
#### ESM
```javascript
import { TaskQueue } from "task-queue-lib";
```
#### CJS
```javascript
const { TaskQueue } = require("task-queue-lib");
```
#### 浏览器中
```html
```
### 使用
#### 切片长度 maxLen
```javascript
const taskQueue = new TaskQueue({ maxLen: 10 });
```
#### 新建一个队列
```javascript
const taskQueue = new TaskQueue({ maxLen: 10 });`
`taskQueue.push([() => {}])
```
#### 单个队列中的函数,有几个就 push 几个
```javascript
taskQueue.push(syncFn.bind(null, "args"));
```
#### 某个队列中的函数全部执行完成后会触发后续操作
```javascript
taskQueue.push([() => {}]).then(console.log); // [ undefined ]
```
或
```javascript
taskQueue.on(taskQueue.defaultKey, console.log).push([() => {}]);
```
#### 队列索引,通过第二个参数分组,异步操作成组完成
```javascript
const fn = (params) => params;
taskQueue.push([fn.bind(this, "hello")], "task1");
taskQueue.push([fn.bind(this, "world")], "task1").then(console.log); // [ 'hello', 'world' ]
taskQueue.push([fn.bind(this, "world")], "task2").then(console.log); // [ 'world' ]
```
#### 删除前三个异步函数
```javascript
taskQueue.unshift(3);
```
#### 初始化当前队列
```javascript
taskQueue.clearQueue();
```
#### 队列步进函数和事件
当我们通过 maxLen 将 push 的队列进行拆分,可以监听队列的步进事件,比如队列长度为 10,maxLen 为 3,那么就会执行 4 次步进函数及事件。
```javascript
// 实例化TaskQueue对象时,传入函数stepCb可以收到队列每次执行的消息。此外通过使用on方法,可以监听队列的步进事件,事件命名规则是`${key}:${step}`,key是taskQueue.push的第二个参数,step是当前队列的步进值。
const stopFn = async () => {
const stopQueue = new TaskQueue({
maxLen: 1,
stepCb: (data) => {
// data类型参考:IStepCbParams
console.log(data);
},
});
const key = "key1";
const queue = [
() => Promise.resolve("hello"),
() => Promise.resolve("1"),
() => Promise.resolve("stop"),
() => Promise.resolve("2"),
() => Promise.reject("3"),
];
stopQueue.push(queue, "key1");
for (let i = 1; i < queue.length + 1; i++) {
stopQueue.on(key + `:${i}`, (data) => {
const isStop = data.step === 3;
console.log(isStop);
if (isStop) stopQueue.clearQueue(); // 停止队列后续操作
});
}
};
stopFn();
```