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
			| 
								 
											3 years ago
										 
									 | 
							
								// 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);
							 |