1 | module.exports = function (tasks, cb) {
|
2 | var results, pending, keys
|
3 | var isSync = true
|
4 |
|
5 | if (Array.isArray(tasks)) {
|
6 | results = []
|
7 | pending = tasks.length
|
8 | } else {
|
9 | keys = Object.keys(tasks)
|
10 | results = {}
|
11 | pending = keys.length
|
12 | }
|
13 |
|
14 | function done (err) {
|
15 | function end () {
|
16 | if (cb) cb(err, results)
|
17 | cb = null
|
18 | }
|
19 | if (isSync) process.nextTick(end)
|
20 | else end()
|
21 | }
|
22 |
|
23 | function each (i, err, result) {
|
24 | results[i] = result
|
25 | if (--pending === 0 || err) {
|
26 | done(err)
|
27 | }
|
28 | }
|
29 |
|
30 | if (!pending) {
|
31 |
|
32 | done(null)
|
33 | } else if (keys) {
|
34 |
|
35 | keys.forEach(function (key) {
|
36 | tasks[key](function (err, result) { each(key, err, result) })
|
37 | })
|
38 | } else {
|
39 |
|
40 | tasks.forEach(function (task, i) {
|
41 | task(function (err, result) { each(i, err, result) })
|
42 | })
|
43 | }
|
44 |
|
45 | isSync = false
|
46 | }
|