|  |  |  |  | # a-sync-waterfall
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Simple, isolated sync/async waterfall module for JavaScript. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Runs an array of functions in series, each passing their results to the next in | 
					
						
							|  |  |  |  | the array. However, if any of the functions pass an error to the callback, the | 
					
						
							|  |  |  |  | next function is not executed and the main callback is immediately called with | 
					
						
							|  |  |  |  | the error. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | For browsers and node.js. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ## Installation
 | 
					
						
							|  |  |  |  | * Just include a-sync-waterfall before your scripts. | 
					
						
							|  |  |  |  | * `npm install a-sync-waterfall` if you’re using node.js. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ## Usage
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * `waterfall(tasks, optionalCallback, forceAsync);` | 
					
						
							|  |  |  |  | * **tasks** - An array of functions to run, each function is passed a | 
					
						
							|  |  |  |  | `callback(err, result1, result2, ...)` it must call on completion. The first | 
					
						
							|  |  |  |  | argument is an error (which can be null) and any further arguments will be | 
					
						
							|  |  |  |  | passed as arguments in order to the next task. | 
					
						
							|  |  |  |  | * **optionalCallback** - An optional callback to run once all the functions have | 
					
						
							|  |  |  |  | completed. This will be passed the results of the last task's callback. | 
					
						
							|  |  |  |  | * **forceAsync** An optional flag that force tasks run asynchronously even if they are sync. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ##### Node.js:
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```javascript | 
					
						
							|  |  |  |  | var waterfall = require('a-sync-waterfall'); | 
					
						
							|  |  |  |  | waterfall(tasks, callback); | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ##### Browser:
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```javascript | 
					
						
							|  |  |  |  | var waterfall = require('a-sync-waterfall'); | 
					
						
							|  |  |  |  | waterfall(tasks, callback); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // Default: | 
					
						
							|  |  |  |  | window.waterfall(tasks, callback); | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ##### Tasks as Array of Functions
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```javascript | 
					
						
							|  |  |  |  | waterfall([ | 
					
						
							|  |  |  |  |   function(callback){ | 
					
						
							|  |  |  |  |     callback(null, 'one', 'two'); | 
					
						
							|  |  |  |  |   }, | 
					
						
							|  |  |  |  |   function(arg1, arg2, callback){ | 
					
						
							|  |  |  |  |     callback(null, 'three'); | 
					
						
							|  |  |  |  |   }, | 
					
						
							|  |  |  |  |   function(arg1, callback){ | 
					
						
							|  |  |  |  |     // arg1 now equals 'three' | 
					
						
							|  |  |  |  |     callback(null, 'done'); | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | ], function (err, result) { | 
					
						
							|  |  |  |  |   // result now equals 'done' | 
					
						
							|  |  |  |  | }); | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ##### Derive Tasks from an Array.map
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```javascript | 
					
						
							|  |  |  |  | /* basic - no arguments */ | 
					
						
							|  |  |  |  | waterfall(myArray.map(function (arrayItem) { | 
					
						
							|  |  |  |  |   return function (nextCallback) { | 
					
						
							|  |  |  |  |     // same execution for each item, call the next one when done | 
					
						
							|  |  |  |  |     doAsyncThingsWith(arrayItem, nextCallback); | 
					
						
							|  |  |  |  | }})); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /* with arguments, initializer function, and final callback */ | 
					
						
							|  |  |  |  | waterfall([function initializer (firstMapFunction) { | 
					
						
							|  |  |  |  |     firstMapFunction(null, initialValue); | 
					
						
							|  |  |  |  |   }].concat(myArray.map(function (arrayItem) { | 
					
						
							|  |  |  |  |     return function (lastItemResult, nextCallback) { | 
					
						
							|  |  |  |  |       // same execution for each item in the array | 
					
						
							|  |  |  |  |       var itemResult = doThingsWith(arrayItem, lastItemResult); | 
					
						
							|  |  |  |  |       // results carried along from each to the next | 
					
						
							|  |  |  |  |       nextCallback(null, itemResult); | 
					
						
							|  |  |  |  | }})), function (err, finalResult) { | 
					
						
							|  |  |  |  |   // final callback | 
					
						
							|  |  |  |  | }); | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ## Acknowledgements
 | 
					
						
							|  |  |  |  | Hat tip to [Caolan McMahon](https://github.com/caolan) and | 
					
						
							|  |  |  |  | [Paul Miller](https://github.com/paulmillr), whose prior contributions this is | 
					
						
							|  |  |  |  | based upon. | 
					
						
							|  |  |  |  | Also [Elan Shanker](https://github.com/es128) from which this rep is forked | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ## License
 | 
					
						
							|  |  |  |  | [MIT](https://raw.github.com/hydiak/a-sync-waterfall/master/LICENSE) |