utils-series-waterfall

1.0.0 • Public • Published

Waterfall

NPM version Build Status Coverage Status Dependencies

Invoke functions in series, passing the results of one function as arguments to the next function.

Installation

$ npm install utils-series-waterfall

Usage

var waterfall = require( 'utils-series-waterfall' );

waterfall( fcns, clbk[, thisArg] )

Invokes functions in series, passing the results of one function as arguments to the next function.

function foo( next ) {
    next( null, 'beep' );
}
 
function bar( str, next ) {
    console.log( str );
    // => 'beep'
 
    next();
}
 
function done( error ) {
    if ( error ) {
        throw error;
    }
}
 
var fcns = [ foo, bar ];
 
waterfall( fcns, done );

To set the this context for all functions, provide a thisArg.

function foo( next ) {
    this._idx = 0;
    next( null, 'beep' );
}
 
function bar( str, next ) {
    this._idx += 1;
    console.log( str );
    // => 'beep'
 
    next();
}
 
function done( error ) {
    if ( error ) {
        throw error;
    }
    console.log( ctx._idx );
    // => 1
}
 
var ctx = {};
var fcns = [ foo, bar ];
 
waterfall( fcns, done, ctx );

waterfall.factory( fcns, done[, thisArg] )

Returns a reusable waterfall function.

var run = waterfall.factory( fcns, done );
// returns <function>
 
run();
run();
run();
// ...

Notes

  • The last argument applied to each waterfall function is a callback. This function should be invoked upon a series function completion. The first argument is reserved as an error argument (which can be null). Any results which should be passed to the next function in the series should be provided beginning with the second argument.
  • If any function calls the provided callback with a truthy error argument, the waterfall suspends execution and immediately calls the done callback for subsequent error handling.
  • This implementation does not guarantee that execution is asynchronous. To do so, wrap the done callback in a function which either executes at the end of the current stack (e.g., nextTick) or during a subsequent turn of the event loop (e.g., setIntermediate, setTimeout).

Examples

var waterfall = require( 'utils-series-waterfall' );
 
function foo( next ) {
    next( null, 'beep' );
}
 
function bar( str, next ) {
    console.log( str );
    next( null, str.replace( /e/g, 'o' ) );
}
 
function fun( str, next ) {
    console.log( str );
    next();
}
 
function done( error ) {
    if ( error ) {
        throw error;
    }
    console.log( 'done' );
}
 
var fcns = [ foo, bar, fun ];
 
waterfall( fcns, done );

To run the example code from the top-level application directory,

$ node ./examples/index.js

Tests

Unit

This repository uses tape for unit tests. To run the tests, execute the following command in the top-level application directory:

$ make test

All new feature development should have corresponding unit tests to validate correct functionality.

Test Coverage

This repository uses Istanbul as its code coverage tool. To generate a test coverage report, execute the following command in the top-level application directory:

$ make test-cov

Istanbul creates a ./reports/coverage directory. To access an HTML version of the report,

$ make view-cov

Browser Support

This repository uses Testling for browser testing. To run the tests in a (headless) local web browser, execute the following command in the top-level application directory:

$ make test-browsers

To view the tests in a local web browser,

$ make view-browser-tests

License

MIT license.

Copyright

Copyright © 2016. Athan Reines.

Package Sidebar

Install

npm i utils-series-waterfall

Weekly Downloads

3

Version

1.0.0

License

MIT

Last publish

Collaborators

  • kgryte