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.
		
		
		
		
			
				
					68 lines
				
				1.2 KiB
			
		
		
			
		
	
	
					68 lines
				
				1.2 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function Queue(options) {
							 | 
						||
| 
								 | 
							
								  if (!(this instanceof Queue)) {
							 | 
						||
| 
								 | 
							
								    return new Queue(options);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  options = options || {};
							 | 
						||
| 
								 | 
							
								  this.concurrency = options.concurrency || Infinity;
							 | 
						||
| 
								 | 
							
								  this.pending = 0;
							 | 
						||
| 
								 | 
							
								  this.jobs = [];
							 | 
						||
| 
								 | 
							
								  this.cbs = [];
							 | 
						||
| 
								 | 
							
								  this._done = done.bind(this);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var arrayAddMethods = [
							 | 
						||
| 
								 | 
							
								  'push',
							 | 
						||
| 
								 | 
							
								  'unshift',
							 | 
						||
| 
								 | 
							
								  'splice'
							 | 
						||
| 
								 | 
							
								];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								arrayAddMethods.forEach(function(method) {
							 | 
						||
| 
								 | 
							
								  Queue.prototype[method] = function() {
							 | 
						||
| 
								 | 
							
								    var methodResult = Array.prototype[method].apply(this.jobs, arguments);
							 | 
						||
| 
								 | 
							
								    this._run();
							 | 
						||
| 
								 | 
							
								    return methodResult;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Object.defineProperty(Queue.prototype, 'length', {
							 | 
						||
| 
								 | 
							
								  get: function() {
							 | 
						||
| 
								 | 
							
								    return this.pending + this.jobs.length;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Queue.prototype._run = function() {
							 | 
						||
| 
								 | 
							
								  if (this.pending === this.concurrency) {
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (this.jobs.length) {
							 | 
						||
| 
								 | 
							
								    var job = this.jobs.shift();
							 | 
						||
| 
								 | 
							
								    this.pending++;
							 | 
						||
| 
								 | 
							
								    job(this._done);
							 | 
						||
| 
								 | 
							
								    this._run();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (this.pending === 0) {
							 | 
						||
| 
								 | 
							
								    while (this.cbs.length !== 0) {
							 | 
						||
| 
								 | 
							
								      var cb = this.cbs.pop();
							 | 
						||
| 
								 | 
							
								      process.nextTick(cb);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Queue.prototype.onDone = function(cb) {
							 | 
						||
| 
								 | 
							
								  if (typeof cb === 'function') {
							 | 
						||
| 
								 | 
							
								    this.cbs.push(cb);
							 | 
						||
| 
								 | 
							
								    this._run();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function done() {
							 | 
						||
| 
								 | 
							
								  this.pending--;
							 | 
						||
| 
								 | 
							
								  this._run();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = Queue;
							 |