UNPKG

1.31 kBJavaScriptView Raw
1'use strict';
2
3var asyncDone = require('async-done');
4
5var helpers = require('./helpers');
6
7function parallel(values, iterator, extensions, done){
8 // allow for iterator to not be specified
9 if(typeof iterator !== 'function'){
10 done = extensions;
11 extensions = iterator;
12 iterator = asyncDone;
13 }
14
15 // allow for extensions to not be specified
16 if(typeof extensions === 'function'){
17 done = extensions;
18 extensions = {};
19 }
20
21 // handle no callback case
22 if(typeof done !== 'function'){
23 done = helpers.noop;
24 }
25
26 // will throw if non-object
27 var keys = Object.keys(values);
28 // return the same type as passed in
29 var results = Array.isArray(values) ? [] : {};
30 var length = keys.length;
31 var count = length;
32 var idx = 0;
33
34 var exts = helpers.defaultExtensions(extensions);
35
36 for(idx = 0; idx < length; idx++){
37 var key = keys[idx];
38 next(key);
39 }
40
41 function next(key){
42 var fn = values[key];
43
44 var storage = exts.create(fn, key);
45
46 exts.before(storage);
47 iterator(fn, handler);
48
49 function handler(err, result){
50 if(err){
51 exts.error(storage);
52 return done(err, results);
53 }
54
55 exts.after(storage);
56 results[key] = result;
57 if(--count === 0){
58 done(err, results);
59 }
60 }
61 }
62}
63
64module.exports = parallel;