parallel.js 987 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. // execute an array of asynchronous functions in parallel
  2. // @param {Array} fns - an array of functions
  3. // @param {Function} done - callback(err, results)
  4. function parallel (fns, options, done) {
  5. if (typeof options === 'function') {
  6. done = options
  7. options = {}
  8. }
  9. let keys
  10. if (!Array.isArray(fns)) { keys = Object.keys(fns) }
  11. const length = keys ? keys.length : fns.length
  12. let pending = length
  13. const results = keys ? {} : []
  14. function each (i, err, result) {
  15. results[i] = result
  16. if (--pending === 0 || (err && !options.graceful)) {
  17. if (options.graceful && err && length > 1) {
  18. err = null
  19. }
  20. done && done(err, results)
  21. done = null
  22. }
  23. }
  24. if (keys) {
  25. keys.forEach(function (key) {
  26. fns[key](function (err, res) {
  27. each(key, err, res)
  28. })
  29. })
  30. } else {
  31. fns.forEach(function (fn, i) {
  32. fn(function (err, res) {
  33. each(i, err, res)
  34. })
  35. })
  36. }
  37. }
  38. module.exports = parallel