forked from briandemant/photo-mover
-
Notifications
You must be signed in to change notification settings - Fork 0
/
queue.js
47 lines (41 loc) · 892 Bytes
/
queue.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
var Queue = function(options, callback) {
this.doneCallback = callback;
this.concurrentLimit = options.concurrent || 10;
this.jobQueue = [];
this.errors = [];
};
Queue.prototype.add = function(fn) {
this.jobQueue.push(fn);
};
Queue.prototype.start = function() {
for(var i = 0; i < this.concurrentLimit; i++) {
this.dispatch();
}
};
Queue.prototype.runJob = function(fn) {
var self = this;
fn(function(error) {
self.errors.push(error);
if (self.jobQueue.length) {
self.dispatch();
} else {
self.finished();
}
});
};
Queue.prototype.dispatch = function() {
if (this.jobQueue.length) {
this.runJob(this.jobQueue.shift());
}
};
Queue.prototype.finished = function() {
var errors = this.errors.filter(function(error) {
return error;
});
if (errors.length) {
this.doneCallback(this.errors);
} else {
this.doneCallback();
}
};
module.exports = Queue;