p-queue的定義
可以使用併發控制的異步執行隊列
安裝
npm install p-queue
API
傳入一個object對象,返回一個對象實例
- concurrency:併發數量,number類型,最小爲1,最大無限制
- autoStart:當add後是否自動開始,默認爲true
- timeout: 定義超時時間,單位毫秒
- throwOnTimeout:潮溼是否被視爲異常,默認false
- intervalCap:給定時間間隔內的最大運行次數,number類型
- interval:定義間隔時間,單位毫秒
- carryoverConcurrencyCount:是否將間隔時間未完成的任務進入下一間隔,默認false
-
queue
- .add(fn, options?): 添加任務到隊列
- fn要求爲異步請求函數,且返回新的promise;
- 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
- .add(fn, options?): 添加任務到隊列
舉例
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