async.js 942 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. /**
  2. * Module dependencies.
  3. */
  4. var Receiver = require('./receiver')
  5. /**
  6. * Expose `async`.
  7. */
  8. module.exports = async
  9. /**
  10. * Add value to channel via node-style async function.
  11. *
  12. * @param {Function} channel
  13. * @param {Function|Object} fn async function or object with async method
  14. * @param {String} method name only if fn is an object
  15. * @param {mixed} args async function arguments without callback
  16. * @return {Function} thunk
  17. */
  18. function async(ch, fn/*, args...*/) {
  19. var args = [].slice.call(arguments, 2)
  20. var receiver = new Receiver()
  21. var context = null
  22. if (typeof fn === 'object') {
  23. context = fn
  24. fn = fn[args.shift()]
  25. }
  26. args.push(function (err, val) {
  27. if (arguments.length > 2) {
  28. val = [].slice.call(arguments, 1)
  29. }
  30. ch(err, val)(function (err) {
  31. receiver[err ? 'error' : 'add'](err)
  32. })
  33. })
  34. fn.apply(context, args)
  35. return function (cb) {
  36. receiver.callback(cb)
  37. }
  38. }