88 lines
2.5 KiB
Markdown
Executable file
88 lines
2.5 KiB
Markdown
Executable file
# promise-queue [](https://npmjs.org/package/promise-queue) [](https://travis-ci.org/azproduction/promise-queue) [](https://coveralls.io/r/azproduction/promise-queue) [](https://gemnasium.com/azproduction/promise-queue)
|
|
|
|
Promise-based queue
|
|
|
|
## Installation
|
|
|
|
`promise-queue` can be installed using `npm`:
|
|
|
|
```
|
|
npm install promise-queue
|
|
```
|
|
|
|
## Interface
|
|
|
|
- `new Queue(Number maxConcurrent, Number maxQueued): Queue`
|
|
- `Queue#add(Function generator): Promise` - adds function argument that generates a promise to the queue
|
|
- `Queue#getQueueLength(): Number` - returns current length of buffer(added but not started promise generators) `it <= maxQueued`
|
|
- `Queue#getPendingLength(): Number` - returns number of pending(concurrently running) promises `it <= maxConcurrent`
|
|
|
|
## Example
|
|
|
|
### Configure queue
|
|
|
|
By default `Queue` tries to use global Promises, but you can specify your own promises.
|
|
|
|
```js
|
|
Queue.configure(require('vow').Promise);
|
|
```
|
|
|
|
Or use old-style promises approach:
|
|
|
|
```js
|
|
Queue.configure(function (handler) {
|
|
var dfd = $.Deferred();
|
|
try {
|
|
handler(dfd.resolve, dfd.reject, dfd.notify);
|
|
} catch (e) {
|
|
dfd.reject(e);
|
|
}
|
|
return dfd.promise();
|
|
});
|
|
```
|
|
|
|
### Queue one by one example
|
|
|
|
```js
|
|
var maxConcurrent = 1;
|
|
var maxQueue = Infinity;
|
|
var queue = new Queue(maxConcurrent, maxQueue);
|
|
|
|
app.get('/version/:user/:repo', function (req, res, next) {
|
|
queue.add(function () {
|
|
// Assume that this action is a way too expensive
|
|
// Call of this function will be delayed on second request
|
|
return downloadTarballFromGithub(req.params);
|
|
})
|
|
.then(parseJson('package.json'))
|
|
.then(function (package) {
|
|
res.send(package.version);
|
|
})
|
|
.catch(next);
|
|
});
|
|
```
|
|
|
|
### Getting number of pending promises and queue(buffered promises) length
|
|
|
|
```js
|
|
var maxConcurrent = 1;
|
|
var maxQueue = 1;
|
|
var queue = new Queue(maxConcurrent, maxQueue);
|
|
|
|
queue.add(function () {
|
|
queue.getQueueLength() === 0;
|
|
queue.getPendingLength() === 1;
|
|
return somePromise();
|
|
});
|
|
|
|
queue.add(function () {
|
|
queue.getQueueLength() === 0;
|
|
queue.getPendingLength() === 0;
|
|
return somePromise();
|
|
});
|
|
|
|
queue.getQueueLength() === 1;
|
|
queue.getPendingLength() === 1;
|
|
```
|
|
|
|
[Live example](http://jsfiddle.net/RVuEU/1/)
|