UNPKG

1.29 kBJavaScriptView Raw
1'use strict';
2
3var asyncDone = require('async-done');
4
5var helpers = require('./helpers');
6
7function series(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 idx = 0;
32
33 var exts = helpers.defaultExtensions(extensions);
34
35 var key = keys[idx];
36 next(key);
37
38 function next(key){
39 var fn = values[key];
40
41 var storage = exts.create(fn, key);
42
43 exts.before(storage);
44 iterator(fn, handler);
45
46 function handler(err, result){
47 if(err){
48 exts.error(storage);
49 return done(err, results);
50 }
51
52 exts.after(storage);
53 results[key] = result;
54
55 if(++idx >= length){
56 done(err, results);
57 } else {
58 next(keys[idx], done);
59 }
60 }
61 }
62}
63
64module.exports = series;