utils-series-waterfall
v1.0.0
Published
Invoke functions in series, passing the results of one function as arguments to the next function.
Downloads
18
Maintainers
Readme
Waterfall
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 waterfallfunction
is a callback. Thisfunction
should be invoked upon a seriesfunction
completion. The first argument is reserved as anerror
argument (which can benull
). Any results which should be passed to the nextfunction
in the series should be provided beginning with the second argument. - If any
function
calls the provided callback with a truthyerror
argument, the waterfall suspends execution and immediately calls thedone
callback for subsequenterror
handling. - This implementation does not guarantee that execution is asynchronous. To do so, wrap the
done
callback in afunction
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
Copyright
Copyright © 2016. Athan Reines.