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.
		
		
		
		
			
				
					44 lines
				
				1017 B
			
		
		
			
		
	
	
					44 lines
				
				1017 B
			| 
								 
											4 years ago
										 
									 | 
							
								var iterate    = require('./lib/iterate.js')
							 | 
						||
| 
								 | 
							
								  , initState  = require('./lib/state.js')
							 | 
						||
| 
								 | 
							
								  , terminator = require('./lib/terminator.js')
							 | 
						||
| 
								 | 
							
								  ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Public API
							 | 
						||
| 
								 | 
							
								module.exports = parallel;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Runs iterator over provided array elements in parallel
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param   {array|object} list - array or object (named list) to iterate over
							 | 
						||
| 
								 | 
							
								 * @param   {function} iterator - iterator to run
							 | 
						||
| 
								 | 
							
								 * @param   {function} callback - invoked when all elements processed
							 | 
						||
| 
								 | 
							
								 * @returns {function} - jobs terminator
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function parallel(list, iterator, callback)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  var state = initState(list);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  while (state.index < (state['keyedList'] || list).length)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    iterate(list, iterator, state, function(error, result)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      if (error)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        callback(error, result);
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      // looks like it's the last one
							 | 
						||
| 
								 | 
							
								      if (Object.keys(state.jobs).length === 0)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        callback(null, state.results);
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    state.index++;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return terminator.bind(state, callback);
							 | 
						||
| 
								 | 
							
								}
							 |