UNPKG

874 BJavaScriptView Raw
1module.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 // empty
32 done(null)
33 } else if (keys) {
34 // object
35 keys.forEach(function (key) {
36 tasks[key](function (err, result) { each(key, err, result) })
37 })
38 } else {
39 // array
40 tasks.forEach(function (task, i) {
41 task(function (err, result) { each(i, err, result) })
42 })
43 }
44
45 isSync = false
46}