2023-10-03 11:14:36 +08:00
|
|
|
|
# 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)
|