/
gang-bang.js
61 lines (52 loc) · 1.21 KB
/
gang-bang.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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/**
* Creates a group of passed functions, and executes callback when all have completed
* when an error has been detected.
*/
var sys = require('sys');
exports.group = function (fxns, cb) {
if (fxns.length === 0) {
cb();
return;
}
var items_left_to_execute = fxns.length;
var results = [];
var callGroupFunction = function(i, fxn) {
var done = function(result) {
if (result instanceof Error)
return cb(result);
results[i] = result;
items_left_to_execute--;
if (!items_left_to_execute)
cb(results);
};
fxn(done);
};
for ( var i = 0; i < fxns.length; i++) {
callGroupFunction(i, fxns[i]);
}
}
/**
* Executes all functions in order, and a callback when all have completed
* or when an error has been detected
*/
exports.chain = function (fxns, callback) {
if (fxns.length === 0)
return;
var pos = 0;
var results = [];
var callNext = function() {
var done = function(result) {
pos++;
if (result instanceof Error)
return callback(result);
results.push(result);
if (fxns.length > pos) {
callNext();
} else {
callback(results);
}
};
fxns[pos](done);
};
callNext();
}