You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					233 lines
				
				5.4 KiB
			
		
		
			
		
	
	
					233 lines
				
				5.4 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								# fastfall
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[![npm version][npm-badge]][npm-url]
							 | 
						||
| 
								 | 
							
								[![Build Status][travis-badge]][travis-url]
							 | 
						||
| 
								 | 
							
								[![Coverage Status][coveralls-badge]][coveralls-url]
							 | 
						||
| 
								 | 
							
								[![Dependency Status][david-badge]][david-url]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## call your callbacks in a waterfall, without overhead
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Benchmark for doing 3 calls `setImmediate` 100 thousands times:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* non-reusable setImmediate: 407ms
							 | 
						||
| 
								 | 
							
								* [async.waterfall](https://github.com/caolan/async#waterfall): 1203ms
							 | 
						||
| 
								 | 
							
								* [run-waterfall](http://npm.im/run-waterfall): 1432ms
							 | 
						||
| 
								 | 
							
								* [insync.wasterfall](https://www.npmjs.com/package/insync#waterfall):
							 | 
						||
| 
								 | 
							
								  1570ms
							 | 
						||
| 
								 | 
							
								* [neo-async.wasterfall](http://suguru03.github.io/neo-async/doc/async.waterfall.html):
							 | 
						||
| 
								 | 
							
								  445ms
							 | 
						||
| 
								 | 
							
								* [waterfallize](http://npm.im/waterfallize): 757ms
							 | 
						||
| 
								 | 
							
								* `fastfall`: 432ms
							 | 
						||
| 
								 | 
							
								* `fastfall` compiled: 428ms
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								These benchmarks where taken via `bench.js` on node 4.2.2, on a MacBook
							 | 
						||
| 
								 | 
							
								Pro Retina 2014 (i7, 16GB of RAM).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If you need zero-overhead series function call, check out
							 | 
						||
| 
								 | 
							
								[fastseries](http://npm.im/fastseries), for parallel calls check out
							 | 
						||
| 
								 | 
							
								[fastparallel](http://npm.im/fastparallel), and for a fast work queue
							 | 
						||
| 
								 | 
							
								use [fastq](http://npm.im/fastq).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[](https://github.com/feross/standard)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Install
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								npm install fastfall --save
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Usage
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var fall = require('fastfall')()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								fall([
							 | 
						||
| 
								 | 
							
								  function a (cb) {
							 | 
						||
| 
								 | 
							
								    console.log('called a')
							 | 
						||
| 
								 | 
							
								    cb(null, 'a')
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  function b (a, cb) {
							 | 
						||
| 
								 | 
							
								    console.log('called b with:', a)
							 | 
						||
| 
								 | 
							
								    cb(null, 'a', 'b')
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  function c (a, b, cb) {
							 | 
						||
| 
								 | 
							
								    console.log('called c with:', a, b)
							 | 
						||
| 
								 | 
							
								    cb(null, 'a', 'b', 'c')
							 | 
						||
| 
								 | 
							
								  }], function result (err, a, b, c) {
							 | 
						||
| 
								 | 
							
								    console.log('result arguments', arguments)
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You can also set `this` when you create a fall:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var that = { hello: 'world' }
							 | 
						||
| 
								 | 
							
								var fall = require('fastfall')(that)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								fall([a, b, c], result)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function a (cb) {
							 | 
						||
| 
								 | 
							
								  console.log(this)
							 | 
						||
| 
								 | 
							
								  console.log('called a')
							 | 
						||
| 
								 | 
							
								  cb(null, 'a')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function b (a, cb) {
							 | 
						||
| 
								 | 
							
								  console.log('called b with:', a)
							 | 
						||
| 
								 | 
							
								  cb(null, 'a', 'b')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function c (a, b, cb) {
							 | 
						||
| 
								 | 
							
								  console.log('called c with:', a, b)
							 | 
						||
| 
								 | 
							
								  cb(null, 'a', 'b', 'c')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function result (err, a, b, c) {
							 | 
						||
| 
								 | 
							
								  console.log('result arguments', arguments)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You can also set `this` when you run a task:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var that = { hello: 'world' }
							 | 
						||
| 
								 | 
							
								var fall = require('fastfall')()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								fall(new State('world'), [
							 | 
						||
| 
								 | 
							
								  a, b, c,
							 | 
						||
| 
								 | 
							
								], console.log)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function State (value) {
							 | 
						||
| 
								 | 
							
								  this.value = value
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function a (cb) {
							 | 
						||
| 
								 | 
							
								  console.log(this.value)
							 | 
						||
| 
								 | 
							
								  console.log('called a')
							 | 
						||
| 
								 | 
							
								  cb(null, 'a')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function b (a, cb) {
							 | 
						||
| 
								 | 
							
								  console.log('called b with:', a)
							 | 
						||
| 
								 | 
							
								  cb(null, 'a', 'b')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function c (a, b, cb) {
							 | 
						||
| 
								 | 
							
								  console.log('called c with:', a, b)
							 | 
						||
| 
								 | 
							
								  cb(null, 'a', 'b', 'c')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Compile a waterfall
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var fall = require('fastfall')([
							 | 
						||
| 
								 | 
							
								  function a (arg, cb) {
							 | 
						||
| 
								 | 
							
								    console.log('called a')
							 | 
						||
| 
								 | 
							
								    cb(null, arg)
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  function b (a, cb) {
							 | 
						||
| 
								 | 
							
								    console.log('called b with:', a)
							 | 
						||
| 
								 | 
							
								    cb(null, 'a', 'b')
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  function c (a, b, cb) {
							 | 
						||
| 
								 | 
							
								    console.log('called c with:', a, b)
							 | 
						||
| 
								 | 
							
								    cb(null, 'a', 'b', 'c')
							 | 
						||
| 
								 | 
							
								  }])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// a compiled fall supports arguments too!
							 | 
						||
| 
								 | 
							
								fall(42, function result (err, a, b, c) {
							 | 
						||
| 
								 | 
							
								  console.log('result arguments', arguments)
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You can set `this` by doing:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var that = { hello: 'world' }
							 | 
						||
| 
								 | 
							
								var fall = require('fastfall')(that, [
							 | 
						||
| 
								 | 
							
								  function a (arg, cb) {
							 | 
						||
| 
								 | 
							
								    console.log('this is', this)
							 | 
						||
| 
								 | 
							
								    console.log('called a')
							 | 
						||
| 
								 | 
							
								    cb(null, arg)
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  function b (a, cb) {
							 | 
						||
| 
								 | 
							
								    console.log('called b with:', a)
							 | 
						||
| 
								 | 
							
								    cb(null, 'a', 'b')
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  function c (a, b, cb) {
							 | 
						||
| 
								 | 
							
								    console.log('called c with:', a, b)
							 | 
						||
| 
								 | 
							
								    cb(null, 'a', 'b', 'c')
							 | 
						||
| 
								 | 
							
								  }])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// a compiled fall supports arguments too!
							 | 
						||
| 
								 | 
							
								fall(42, function result (err, a, b, c) {
							 | 
						||
| 
								 | 
							
								  console.log('result arguments', arguments)
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								or you can simply attach it to an object:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var that = { hello: 'world' }
							 | 
						||
| 
								 | 
							
								that.doSomething = require('fastfall')([
							 | 
						||
| 
								 | 
							
								  function a (arg, cb) {
							 | 
						||
| 
								 | 
							
								    console.log('this is', this)
							 | 
						||
| 
								 | 
							
								    console.log('called a')
							 | 
						||
| 
								 | 
							
								    cb(null, arg)
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  function b (a, cb) {
							 | 
						||
| 
								 | 
							
								    console.log('called b with:', a)
							 | 
						||
| 
								 | 
							
								    cb(null, 'a', 'b')
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  function c (a, b, cb) {
							 | 
						||
| 
								 | 
							
								    console.log('called c with:', a, b)
							 | 
						||
| 
								 | 
							
								    cb(null, 'a', 'b', 'c')
							 | 
						||
| 
								 | 
							
								  }])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// a compiled fall supports arguments too!
							 | 
						||
| 
								 | 
							
								that.doSomething(42, function result (err, a, b, c) {
							 | 
						||
| 
								 | 
							
								  console.log('this is', this)
							 | 
						||
| 
								 | 
							
								  console.log('result arguments', arguments)
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## API
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### fastfall([this], [functions])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Creates a `fall`, it can either be pre-filled with a `this` value
							 | 
						||
| 
								 | 
							
								and an array of functions.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If there is no list of functions, [a not-compiled fall](#not-compiled)
							 | 
						||
| 
								 | 
							
								is returned, if there is a list of function [a compiled fall](#compiled)
							 | 
						||
| 
								 | 
							
								is returned.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<a name="not-compiled"></a>
							 | 
						||
| 
								 | 
							
								### fall([this], functions, [done])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Calls the functions in a waterfall, forwarding the arguments from one to
							 | 
						||
| 
								 | 
							
								another. Calls `done` when it has finished.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<a name="compiled"></a>
							 | 
						||
| 
								 | 
							
								### fall(args..., [done])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Calls the compiled functions in a waterfall, forwarding the arguments from one to
							 | 
						||
| 
								 | 
							
								another. Additionally, a user can specify some arguments for the first
							 | 
						||
| 
								 | 
							
								function, too. Calls `done` when it has finished.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## License
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								MIT
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[npm-badge]: https://badge.fury.io/js/fastfall.svg
							 | 
						||
| 
								 | 
							
								[npm-url]: https://badge.fury.io/js/fastfall
							 | 
						||
| 
								 | 
							
								[travis-badge]: https://api.travis-ci.org/mcollina/fastfall.svg
							 | 
						||
| 
								 | 
							
								[travis-url]: https://travis-ci.org/mcollina/fastfall
							 | 
						||
| 
								 | 
							
								[coveralls-badge]:https://coveralls.io/repos/mcollina/fastfall/badge.svg?branch=master&service=github
							 | 
						||
| 
								 | 
							
								[coveralls-url]: https://coveralls.io/github/mcollina/fastfall?branch=master
							 | 
						||
| 
								 | 
							
								[david-badge]: https://david-dm.org/mcollina/fastfall.svg
							 | 
						||
| 
								 | 
							
								[david-url]: https://david-dm.org/mcollina/fastfall
							 |