李恒道 发表于 2023-9-25 14:53:03

js 队列限制并发

如我们需要执行100个任务,但是最大并发只允许五个
为了限制同时执行的任务数
可以使用https://www.npmjs.com/package/p-limit库
首先创建一个限制函数,参数是需要限制的数量
```js
const limit = pLimit(1);
```
然后调用limit传入一个函数即可,当不满足执行条件的时候不会执行
允许Async/Promise函数
```js
limit(() => fetchSomething('foo'))
```
其limit函数也会返回一个Promise,状态代表当前函数是否被执行完毕
```js
const input = [
        limit(() => fetchSomething('foo')),
        limit(() => fetchSomething('bar')),
        limit(() => doSomething())
];

// Only one promise is run at once
const result = await Promise.all(input);
console.log(result);
```
# 属性值
activeCount:表示当前正在运行的任务数量
pendingCount:表示当前等待运行的任务数量
clearQueue()丢弃等待运行的队列
# Tips
limit(fn, ...args)
limit也可以传入参数,为了解决闭包的问题

王一之 发表于 2023-9-25 14:57:33

js不是单线程么,限制干啥

李恒道 发表于 2023-9-25 15:57:00

王一之 发表于 2023-9-25 14:57
js不是单线程么,限制干啥

比如我要跑500个下载任务,如果同时发网络包,会你下一块我下一块
这样限制住,最大三个,就优先下载完这三个再下其他的
提高容错性

steven026 发表于 2023-9-25 15:59:52

```js
const Surge = (limit, total) => {
    return new Promise((allDone) => {
      const Queue = Array(total)
            .fill()
            .map((i, index) => CreateRandomPromise(index));
      console.log('队列总计' + total, '队列限制' + limit);

      let inProgress = 0;

      for (let i = 0; i < limit; i++) {
            inProgress++;
            Queue.shift()();
      }

      function Check(index, delay) {
            const left = Queue.length;
            inProgress--;
            console.log('队列' + index + '运行完毕', '随机延迟' + delay, '队列剩余' + left);

            if (left > 0) {
                inProgress++;
                Queue.shift()();
            }

            if (inProgress == 0 && left == 0) {
                console.log('队列完毕allDone');
                allDone('allDone');
            }
      }

      function CreateRandomPromise(index) {
            return () =>
                new Promise((resolve) => {
                  const delay = Math.random() * 3000;
                  setTimeout(() => {
                        Check(index, delay);
                        resolve();
                  }, delay);
                });
      }
    });
};
```
手撸了一个迸发限制
![](https://bbs.tampermonkey.net.cn/data/attachment/forum/202303/27/091559h4pubz916zb8dduz.jpg)

!(data/attachment/forum/202309/25/155937p0l602eg0ql4stl9.png)

李恒道 发表于 2023-9-25 16:17:40

steven026 发表于 2023-9-25 15:59
```js
const Surge = (limit, total) => {
    return new Promise((allDone) => {


6!我都是有啥先去查查库
能install绝不手写

steven026 发表于 2023-9-25 16:19:59

李恒道 发表于 2023-9-25 16:17
6!我都是有啥先去查查库
能install绝不手写

我如果能自己实现绝不require import
!(data/attachment/forum/202309/25/161953bgj2vmm8g2umf102.jpg)

王一之 发表于 2023-9-25 16:32:02

李恒道 发表于 2023-9-25 15:57
比如我要跑500个下载任务,如果同时发网络包,会你下一块我下一块
这样限制住,最大三个,就优先下载完这 ...

有道理

王一之 发表于 2023-9-25 16:32:56

李恒道 发表于 2023-9-25 16:17
6!我都是有啥先去查查库
能install绝不手写

我也是
页: [1]
查看完整版本: js 队列限制并发