code: function DaisyChain(workers, concurrency) {
    var self = this
        , queues = this.queues = new Array(workers.length);
  
    // create queues and inject unidirectional linked list marker.
    var last;
    for (var i = 0; i < workers.length; i++) {
      var queue = queues[i] = async.queue(workers[i], concurrency);
      last = queue;
    }
  
    // add hooks for empty and drain
    last.empty = function() {
      if (self.empty) {
        async.all(queues, function(q, cb){ cb(q.length() === 0); }, function(yes) { if (yes) self.empty(); });
      }
    }
  
    last.drain = function() {
      if (self.drain) {
        async.every(queues, function(q, cb){ cb((q.length()+q.running()) === 0); }, function(yes) { if (yes) self.drain(); });
      }
    }
  }
docs: Create a queue for each worker. Pass successful output of each queue to the next worker.
  A worker may only pass error or one object (memo) to the callback.
  @param callback(err, memo);