async.js 942 字节
/**
 * Module dependencies.
 */
var Receiver = require('./receiver')

/**
 * Expose `async`.
 */
module.exports = async

/**
 * Add value to channel via node-style async function.
 *
 * @param {Function} channel
 * @param {Function|Object} fn async function or object with async method
 * @param {String} method name only if fn is an object
 * @param {mixed} args async function arguments without callback
 * @return {Function} thunk
 */
function async(ch, fn/*, args...*/) {
  var args     = [].slice.call(arguments, 2)
  var receiver = new Receiver()
  var context  = null

  if (typeof fn === 'object') {
    context = fn
    fn = fn[args.shift()]
  }

  args.push(function (err, val) {
    if (arguments.length > 2) {
      val = [].slice.call(arguments, 1)
    }
    ch(err, val)(function (err) {
      receiver[err ? 'error' : 'add'](err)
    })
  })

  fn.apply(context, args)

  return function (cb) {
    receiver.callback(cb)
  }
}