并发控制的异步执行队列p-queue的用法

p-queue的定义

可以使用并发控制的异步执行队列

安装

npm install p-queue

API

  • PQueue(options?)

传入一个object对象,返回一个对象实例
- concurrency:并发数量,number类型,最小为1,最大无限制
- autoStart:当add后是否自动开始,默认为true
- timeout: 定义超时时间,单位毫秒
- throwOnTimeout:潮湿是否被视为异常,默认false
- intervalCap:给定时间间隔内的最大运行次数,number类型
- interval:定义间隔时间,单位毫秒
- carryoverConcurrencyCount:是否将间隔时间未完成的任务进入下一间隔,默认false

  • queue

    • .add(fn, options?): 添加任务到队列
      1. fn要求为异步请求函数,且返回新的promise;
      2. options为object,priority优先级,number类型,数值越大优先级越高。
    • .addAll(fn, options?)
    • .pause()
    • .start():开始执行队列添加的任务
    • .onEmpty()
      当队列成为空的时候,返回一个promise
    • .onIdle()
      当队列成为空并且所有的任务都执行完的时候,返回一个promise。
      注意:与onEmpty()不同点在于保证所有任务都执行完了,即queue.size === 0 && queue.pending === 0. onEmpty是队列成为空,但是promise不一定已经执行完了。
    • .clear()
    • .size
    • .pending
    • .timeout
    • .concurrency
    • .isPaused

举例

example.js

const delay = require('delay');
const {default: PQueue} = require('p-queue');
 
const queue = new PQueue({concurrency: 1});
 
(async () => {
    await delay(200);
 
    console.log(`8. Pending promises: ${queue.pending}`);
    //=> '8. Pending promises: 0'
 
    (async () => {
        await queue.add(async () => '🐙');
        console.log('11. Resolved')
    })();
 
    console.log('9. Added 🐙');
 
    console.log(`10. Pending promises: ${queue.pending}`);
    //=> '10. Pending promises: 1'
 
    await queue.onIdle();
    console.log('12. All work is done');
})();
 
(async () => {
    await queue.add(async () => '🦄');
    console.log('5. Resolved')
})();
console.log('1. Added 🦄');
 
(async () => {
    await queue.add(async () => '🐴');
    console.log('6. Resolved')
})();
console.log('2. Added 🐴');
 
(async () => {
    await queue.onEmpty();
    console.log('7. Queue is empty');
})();
 
console.log(`3. Queue size: ${queue.size}`);
//=> '3. Queue size: 1`
 
console.log(`4. Pending promises: ${queue.pending}`);
//=> '4. Pending promises: 1'

运行结果:

1. Added 🦄
2. Added 🐴
3. Queue size: 1
4. Pending promises: 1
5. Resolved 🦄
6. Resolved 🐴
7. Queue is empty
8. Pending promises: 0
9. Added 🐙
10. Pending promises: 1
11. Resolved 🐙
12. All work is done
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章