Promise-based queue. Support timeout, retry and so on.
var Queue = require('promise-queue-plus');
var q = Queue.Promise; //a Promise utils;
//Realize a queue with a maximum concurrency of 1
var queue1 = new 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.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 }
go
*/
Creates a queue;
maxConcurrent
MaxNumber Concurrent
about options like:
var Queue = require("promise-queue-plus");
var queue = new 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
})
a Promise utils, See also extend-promise#类扩展
Note: The prototype is not expanded with extend-promise;
Modify the internal use of Promise , the default use of bluebird
Queue.use(Promise)
usePromise
;Queue.createUse(Promise)
return new Class usePromise
;
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 = new 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
add job (FIFO)
promisefun
promise functionargs
arguments about options like:
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)
like push
and start queue
like unshift
and start queue
executor
like thenew Promise(executor)
options
like 'options' forpush
start
Whether to start immediatelyjump
Whether the LIFO mode
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 Arraystart
Whether to start immediatelyjump
Whether the LIFO mode
queue.addArray([
[function(a){return a},[1],{}],
[function(a,b){return a+b;},[1,2],{}]
],true).then(console.log,console.error);
//output [1,3]
Add multiple jobs with Array, promise value as Map;
props
arguments Mapstart
Whether to start immediatelyjump
Whether the LIFO mode
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
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)
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 instead of bluebird;
- dist/promise-queue-plus.js
- dist/promise-queue-plus.min.js (gzip 3.8k)