promise-queue-plus
Version:
Promise-based queue. Support timeout, retry and so on.
271 lines (218 loc) • 7.71 kB
Markdown
[![NPM version][npm-image]][npm-url]
[![npm download][download-image]][npm-url]
[![Test coverage][coveralls-image]][coveralls-url]
[![Build Status][BuildStatus-image]][BuildStatus-url]
Promise-based queue. Support timeout, retry and so on.
``` javascript
var Queue = require('promise-queue-plus');
var q = Queue.Promise; //a Promise utils;
//Realize a queue with a maximum concurrency of 1
var queue1 = Queue(1,{
"retry":0 //Number of retries
,"retryIsJump":false //retry now?
,"timeout":0 //The timeout period
});
//a return promise function
function testfn(i){
return new Promise(function(resolve,reject){
setTimeout(function(){
resolve(i)
},300)
})
}
var log = function(msg){ console.log(msg); }
queue1.push(testfn,[1]) //add job (FIFO)
.then(log);
queue1.push(function(){return 2;}) //The normal function returns a promise according to the Promise / A + rule
.then(log);
queue1.unshift(testfn,[0]) //add job (LIFO)
.then(log);
queue1.addLikeArray([3,4],testfn,{'workResolve':log}) //Add multiple jobs with Array, Work done will execute 'workResolve'
.then(log)
queue1.addLikeProps({'a':5,'b':6,'c':7},testfn,{'workResolve':log}) //Add multiple jobs with Map,
.then(log)
queue1.add(function(resolve,reject){
resolve(8);
}).then(log)
//queue1.start(); //queue start;
queue1.go(testfn,['go']).then(log)
/*
Equivalent to:
queue1.push(testfn,['go']).then(console.log);
queue1.start();
* In general, it is convenient to use the 'go'
*/
// Output:
/*
0
1
2
3
4
[ 3, 4 ]
5
6
7
{ a: 5, b: 6, c: 7 }
8
go
*/
```
Creates a queue;
- `maxConcurrent` MaxNumber Concurrent
about options like:
```js
var Queue = require("promise-queue-plus");
var queue = Queue(10,{
"queueStart":function(queue){}
,"queueEnd":function(queue){}
,"workAdd":function(item,queue){}
,"workResolve":function(value,queue){}
,"workReject":function(reason,queue){}
,"workFinally":function(queue){}
,"retry":3
,"retryIsJump":true
,"timeout":2000
,"autoRun":true
})
```
a Promise utils, See also [extend-promise
Note: The prototype is not expanded with [extend-promise][github-extend-promise];
Modify the internal use of Promise , the default use of [bluebird][github-bluebird]
- `Queue.use(Promise)` use `Promise`;
- `Queue.createUse(Promise)` return new Class use `Promise`;
```javascript
var Queue = require("promise-queue-plus") //default use of bluebird
Queue.Promise.defer().promise instanceof Promise; //false
//use ES6 Promise
Queue.use(Promise);
Queue.Promise.defer().promise instanceof Promise; //true
var queue1 = Queue(1);
queue1.push(function(){}) instanceof Promise; //true;
//Create a new class `NQueue`, does not affect the original` Queue`;
var NQueue = Queue.createUse(require("q")); //use q module
//use create function (v1.2+)
var Queue = require("promise-queue-plus/create")(Promise);
```
add job (FIFO)
- `promisefun` promise function
- `args` arguments
about options like:
```js
queue.push(function(a,b){return a+b;},[1,2],{
"workResolve":false //1. Queue events are not executed
,"workReject":function(reason,queue){} //2. Are executed
,"workFinally":function(queue){return false;} //3. if return false,Queue events are not executed
,"retry":0 //Override the queue settings
,"retryIsJump":false //Override the queue settings
,"timeout":0 //Override the queue settings
});
```
add job (LIFO)
### queue.go(promisefun, *args[]*, *options*)
like `push` and start queue
### queue.jump(promisefun, *args[]*, *options*)
like `unshift` and start queue
### queue.add(executor, *options*, *start*, *jump*)
- `executor` like the `new Promise(executor)`
- `options` like 'options' for `push`
- `start` Whether to start immediately
- `jump` Whether the LIFO mode
```js
queue.add(function(resolve, reject){
resolve(1);
},true).then(console.log,console.error)
//output 1;
```
Add multiple jobs with Array, promise value as Array;
- `arr` arguments Array
- `start` Whether to start immediately
- `jump` Whether the LIFO mode
```js
queue.addArray([
[],{}],
[],{}]
],true).then(console.log,console.error);
//output [1,3]
```
Add multiple jobs with Array, promise value as Map;
- `props` arguments Map
- `start` Whether to start immediately
- `jump` Whether the LIFO mode
```js
queue.addProps({
a:[function(a){return a},[1]],
b:[function(a,b){return a+b;},[1,2]]
},true).then(console.log,console.error);
//output {a:1,b:3}
```
Syntax for 'addArray' sugar
```js
function addfn(){
var i = 0,sum;
while(i<arguments.length){
sum = i == 0 ? arguments[i] : sum + arguments[i];
}
return sum;
}
queue.addLikeArray([1,[1,2]],addfn,true).then(console.log,console.error);
//output [1,3]
```
like `queue.addLikeArray`,To "promisefun" pass parameters similar to "forEach" (element, index, arrArgs)
```js
function fn(v,i,arr){
return i + " : " + v;
}
queue.addLikeArrayEach([1,[1,2]],fn,true).then(console.log,console.error);
//output [ '0 : 1', '1 : 1,2' ]
```
Syntax for 'addProps' sugar
like `queue.addLikeProps`,To "promisefun" pass parameters similar to "forEach" (value, key, props)
start queue;
stop queue;
clear queue,The rest of the queue will be rejected with `reason`;
Set/Get queue `options`
Get MaxNumber Concurrent;
Set MaxNumber Concurrent;
Queue remaining job count;
Queue running job count;
Queue other error handling
Because `bluebird` too big, Of browsers use [easy-promise][github-easy-promise] instead of [bluebird][github-bluebird];
- dist/promise-queue-plus.js
- dist/promise-queue-plus.min.js (gzip 3.8k)
[]: https://img.shields.io/npm/v/promise-queue-plus.svg
[]: https://img.shields.io/npm/dm/promise-queue-plus.svg
[]: https://npmjs.org/package/promise-queue-plus
[]: https://coveralls.io/repos/cnwhy/promise-queue-plus/badge.svg?branch=master
[]: https://coveralls.io/r/cnwhy/promise-queue-plus?branch=master
[]: https://travis-ci.org/cnwhy/promise-queue-plus
[]: https://api.travis-ci.org/cnwhy/promise-queue-plus.svg
[]: https://github.com/kriskowal/q
[]: https://github.com/petkaantonov/bluebird
[]: https://github.com/petkaantonov/bluebird
[]: https://github.com/cnwhy/extend-promise