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.
		
		
		
		
		
			
		
			
				
					
					
						
							84 lines
						
					
					
						
							2.3 KiB
						
					
					
				
			
		
		
	
	
							84 lines
						
					
					
						
							2.3 KiB
						
					
					
				| // MIT license (by Elan Shanker).
 | |
| (function(globals) {
 | |
|   'use strict';
 | |
| 
 | |
|   var executeSync = function(){
 | |
|     var args = Array.prototype.slice.call(arguments);
 | |
|     if (typeof args[0] === 'function'){
 | |
|       args[0].apply(null, args.splice(1));
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   var executeAsync = function(fn){
 | |
|     if (typeof setImmediate === 'function') {
 | |
|       setImmediate(fn);
 | |
|     } else if (typeof process !== 'undefined' && process.nextTick) {
 | |
|       process.nextTick(fn);
 | |
|     } else {
 | |
|       setTimeout(fn, 0);
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   var makeIterator = function (tasks) {
 | |
|     var makeCallback = function (index) {
 | |
|       var fn = function () {
 | |
|         if (tasks.length) {
 | |
|           tasks[index].apply(null, arguments);
 | |
|         }
 | |
|         return fn.next();
 | |
|       };
 | |
|       fn.next = function () {
 | |
|         return (index < tasks.length - 1) ? makeCallback(index + 1): null;
 | |
|       };
 | |
|       return fn;
 | |
|     };
 | |
|     return makeCallback(0);
 | |
|   };
 | |
|   
 | |
|   var _isArray = Array.isArray || function(maybeArray){
 | |
|     return Object.prototype.toString.call(maybeArray) === '[object Array]';
 | |
|   };
 | |
| 
 | |
|   var waterfall = function (tasks, callback, forceAsync) {
 | |
|     var nextTick = forceAsync ? executeAsync : executeSync;
 | |
|     callback = callback || function () {};
 | |
|     if (!_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);
 | |
|           }
 | |
|           nextTick(function () {
 | |
|             iterator.apply(null, args);
 | |
|           });
 | |
|         }
 | |
|       };
 | |
|     };
 | |
|     wrapIterator(makeIterator(tasks))();
 | |
|   };
 | |
| 
 | |
|   if (typeof define !== 'undefined' && define.amd) {
 | |
|     define([], function () {
 | |
|       return waterfall;
 | |
|     }); // RequireJS
 | |
|   } else if (typeof module !== 'undefined' && module.exports) {
 | |
|     module.exports = waterfall; // CommonJS
 | |
|   } else {
 | |
|     globals.waterfall = waterfall; // <script>
 | |
|   }
 | |
| })(this);
 |