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.
		
		
		
		
		
			
		
			
				
					56 lines
				
				980 B
			
		
		
			
		
	
	
					56 lines
				
				980 B
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = parallelLimit;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*!
							 | 
						||
| 
								 | 
							
								 * ignore
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function parallelLimit(fns, limit, callback) {
							 | 
						||
| 
								 | 
							
								  let numInProgress = 0;
							 | 
						||
| 
								 | 
							
								  let numFinished = 0;
							 | 
						||
| 
								 | 
							
								  let error = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (limit <= 0) {
							 | 
						||
| 
								 | 
							
								    throw new Error('Limit must be positive');
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (fns.length === 0) {
							 | 
						||
| 
								 | 
							
								    return callback(null, []);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (let i = 0; i < fns.length && i < limit; ++i) {
							 | 
						||
| 
								 | 
							
								    _start();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function _start() {
							 | 
						||
| 
								 | 
							
								    fns[numFinished + numInProgress](_done(numFinished + numInProgress));
							 | 
						||
| 
								 | 
							
								    ++numInProgress;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const results = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function _done(index) {
							 | 
						||
| 
								 | 
							
								    return (err, res) => {
							 | 
						||
| 
								 | 
							
								      --numInProgress;
							 | 
						||
| 
								 | 
							
								      ++numFinished;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (error != null) {
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (err != null) {
							 | 
						||
| 
								 | 
							
								        error = err;
							 | 
						||
| 
								 | 
							
								        return callback(error);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      results[index] = res;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (numFinished === fns.length) {
							 | 
						||
| 
								 | 
							
								        return callback(null, results);
							 | 
						||
| 
								 | 
							
								      } else if (numFinished + numInProgress < fns.length) {
							 | 
						||
| 
								 | 
							
								        _start();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |