node package manager
Share your code. npm Orgs help your team discover, share, and reuse code. Create a free org ยป



sink is a pair of simple sequence functions for untangling async code.

{q} = require 'sink'
for name, dir of dirs 
  q path.exists, dir, (exists) ->
    die "#{dir} doesn't exist" unless exists
q -> puts "looks good."


The q function takes either a single callback, or a function, optional args, and a callback. q calls can be made from anywhere.

q process.nextTick ->
  puts "In the town"
  q process.nextTick -> puts "where I was born"
q -> puts "There lived a man"
q process.nextTick -> puts "Who sailed the sea"
q -> puts "The end!"


q.parallel runs a series of callbacks concurrently. The next q'd function won't fire until they've all completed.

wait = (time, cb) -> setTimeout cb, time 
q.parallel (p) ->
  p wait, 100, -> puts "A"
  p wait, 50, -> puts "B"
  p wait, 0, -> puts "C"
q -> puts "Now I know my CBAs"

The Good

sink is only 20 lines long, and should more or less do what is expected even with complicated nesting. It allows for a succinct style and leads to more readable code than nested callbacks, and provides greater freedom than other step type libraries.

The Bad

I don't really know what I'm doing. This has only been tested on toy projects, and has no error handling baked in. There's only a single global q, so this will fall down badly if you perform non parallel actions during web requests, as each request will have to wait its turn. Per request qs will be added soon.