utils-series-waterfall
v1.0.0
Published
Invoke functions in series, passing the results of one function as arguments to the next function.
Maintainers
Readme
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.
