併發控制的異步執行隊列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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章