Functional async flow control library


Functional async flow control library. Turn your asynchronous code into bite-sized synchronous looking functions.

Node.js / Browserify

var breeze = require('breeze')
  • breeze(next) - Initialize breeze flow system, supports initial .then method.
  • .when(check, next) - When check is truthy, add next to the stack
  • .maybe(check, next) - When check is truthy, add next to the stack, sugar for breeze.when
  • .some(check, next) - When check is truthy and no other some or none has ran, add to the stack
  • .none(next) - Whenever no some have ran, add callback to the stack
  • .then(next) - Add callback to stack
  • .catch(next) - Any error caught will terminate stack and be sent here
  • .promise() - Returns a deferred promise system, allowing for a second .catch
  • .reset() - Reset current system

The next method passed through breeze has a very small api. It accepts two variants of usage, normal node style err, arguments..., and promise, arguments....

When a truthy err is passed the system will halt (no other actions will be taken) and .catch will be triggered.

When a promise is passed the system will attach to either the then / catch methods, or the .then(then, catch) method style depending on the promise type passed. Whenever the then is invoked, any arguments passed along with the passed promise are placed at the front of the arguments array, and the success arguments will be last.

This allows you to chain multiple promises while still passing values down the chain.

function fetchUserTodos (username) {
  // Initialize breeze, fetch a user 
  var flow = breeze(function (next) {
  // Fetch user todos, pass user along the chain 
  flow.then(function (nextuser) {
    next(user.getTodos(), user)
  // Catch bugs before you do your work! 
  flow.when(function (usertodos) {
    return todos.getLength() < 0
  }, function (nextusertodos) {
    next(, user)
  // Do whatever else you want 
  flow.then(function (nextusertodos) {
    next(null, user, todos)
  flow.catch(function (err) {
    // handle internal function error should you want 
    if (err.code === 500) {
      console.error('Holy Switch A Roo Batman! I think something really went wrong.')
  return flow.promise()
var promise = fetchUserTodos('nijikokun')
promise.then(function (usertodos) {
  // Show todos 
promise.catch(function (err) {
  // Show error in application 

Check out the examples directory for in-depth examples and tutorials of how to use breeze.

Licensed under The MIT License.