# await-num-q 限数阀
## 关键字
- 异步
- 队列
- 限数阀
- 限制异步任务数量
- 压缩请求
- 合并请求
## 介绍
这是一个用于解决异步任务数量太大需要`限制异步任务数量的库`，比如浏览器端 一次性发送很多的请求会导致请求挂起，例如在有大量图片加载时 网络不太好会导致后续其他的接口请求挂起得不到反馈，这时需要一个工具来解决同时请求图片的数量不得大于某个值，这样后续的接口请求才能正常的发送。于是此库便诞生了
## 下载
```sh
npm i await-num-q
# or
pnpm i await-num-q
# or
yarn i await-num-q
```

## 使用

> 导入
```js
import { asyncQueue } from 'await-num-q'
```
> 初始化队列
```js
let q = new asyncQueue(3)// 3 表示能够同时在当前队列执行的任务数量
```
> 执行
```js
async function test(){
    async function _get(){}
    let data = await q.wait(_get) // 这样就能拿到请求的数据 且不会超过指定数量
}
```
## api列表

```ts
/**
 * 异步参数对象
 * @property max 最大并发数
 * @property retry 失败重试次数
 * @property endCallback 队列结束回调函数
 */
export type AsyncParams = {
    max?: number;
    retry?: number;
    endCallback?: () => void;
};
/**
 * 异步任务对象
 */
export type RunFunBoj = {
    status: "wait" | "ing" | "end" | "fail";
    target: Function;
    retry: number;
    callback?: Function;
    err?: Function;
};
/**
 * 异步队列
 */
export declare class asyncQueue {
    #private;
    constructor({ max, retry, endCallback, }: AsyncParams);
    /**
     * 添加任务
     * @param f 目标函数
     * @param callback 成功回调函数
     * @param err 错误回调函数
     * @returns 添加成功与否
     */
    push(f: Function, callback?: Function, err?: Function): boolean;
    /**
     * 清除运行完成的任务
     */
    clear(fial?: boolean): void;
    /**
     * 添加并运行任务 若是没有传入函数 运行 之前传入的任务
     * @param f 目标函数
     * @param callback 成功回调函数
     * @param err 错误回调函数
     * @returns 添加成功与否
     */
    run(f?: Function, callback?: Function, err?: Function): Promise<void>;
    /**
     * 获取所有的 任务
     * @returns
     */
    getTasks(): RunFunBoj[];
    /**
     * 异步运行并得到返回值
     * @param fun 目标函数
     * @returns
     */
    wait(fun: (...arg: any) => any): Promise<any>;
}
/**
 * 在某个异步请求 参数相同 返回的值相同
 * 并且在同一时间段 会发送多个亲求的场景
 * 压缩正在进行的异步请求 为一个
 * 避免同时条用多个请求导致后续请求 挂起
 * @param asyncFun 异步函数
 * @param param 函数传参 必须传入支持序列化的
 * @returns
 */
export declare function MergeAsync<T extends (...args: any) => Promise<any>>(asyncFun: T, ...param: Parameters<T>): Promise<ReturnType<T>>;

```