utils-series-waterfall v1.0.0
Waterfall
Invoke functions in series, passing the results of one function as arguments to the next function.
Installation
$ npm install utils-series-waterfallUsage
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
argumentapplied to each waterfallfunctionis a callback. Thisfunctionshould be invoked upon a seriesfunctioncompletion. The first argument is reserved as anerrorargument (which can benull). Any results which should be passed to the nextfunctionin the series should be provided beginning with the second argument. - If any
functioncalls the provided callback with a truthyerrorargument, the waterfall suspends execution and immediately calls thedonecallback for subsequenterrorhandling. - This implementation does not guarantee that execution is asynchronous. To do so, wrap the
donecallback in afunctionwhich 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.jsTests
Unit
This repository uses tape for unit tests. To run the tests, execute the following command in the top-level application directory:
$ make testAll 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-covIstanbul creates a ./reports/coverage directory. To access an HTML version of the report,
$ make view-covBrowser 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-browsersTo view the tests in a local web browser,
$ make view-browser-testsLicense
Copyright
Copyright © 2016. Athan Reines.