blob: 02cce7734269137cb279d38e47266a5a1f36773f [file] [log] [blame]
Leo Repp58b9f112021-11-22 11:57:47 +01001'use strict';
2
3var once = require('once');
4
5var helpers = require('./helpers');
6
7function mapSeries(values, iterator, extensions, done) {
8 // Allow for extensions to not be specified
9 if (typeof extensions === 'function') {
10 done = extensions;
11 extensions = {};
12 }
13
14 // Handle no callback case
15 if (typeof done !== 'function') {
16 done = helpers.noop;
17 }
18
19 done = once(done);
20
21 // Will throw if non-object
22 var keys = Object.keys(values);
23 var length = keys.length;
24 var idx = 0;
25 // Return the same type as passed in
26 var results = helpers.initializeResults(values);
27
28 var exts = helpers.defaultExtensions(extensions);
29
30 if (length === 0) {
31 return done(null, results);
32 }
33
34 var key = keys[idx];
35 next(key);
36
37 function next(key) {
38 var value = values[key];
39
40 var storage = exts.create(value, key) || {};
41
42 exts.before(storage);
43 iterator(value, key, once(handler));
44
45 function handler(err, result) {
46 if (err) {
47 exts.error(err, storage);
48 return done(err, results);
49 }
50
51 exts.after(result, storage);
52 results[key] = result;
53
54 if (++idx >= length) {
55 done(err, results);
56 } else {
57 next(keys[idx]);
58 }
59 }
60 }
61}
62
63module.exports = mapSeries;