forked from caolan/async
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathwaterfall.js
38 lines (36 loc) · 1.16 KB
/
waterfall.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
'use strict';
var control = require( './control' );
var timing = require( './timing' );
var utils = require( './utils' );
module.exports = function waterfall( tasks, callback ) {
callback = callback || function() {};
if ( !utils.isArray( tasks ) ) {
var err = new Error( 'First argument to waterfall must be an array of functions' );
return callback( err );
}
if ( !tasks.length ) {
return callback();
}
var wrapIterator = function( iterator ) {
return function( err ) {
if ( err ) {
callback.apply( null, arguments );
callback = function() {};
}
else {
var args = Array.prototype.slice.call( arguments, 1 );
var next = iterator.next();
if ( next ) {
args.push( wrapIterator( next ) );
}
else {
args.push( callback );
}
timing.setImmediate( function() {
iterator.apply( null, args );
} );
}
};
};
wrapIterator( control.iterator( tasks ) )();
};