UNPKG

1.02 kBJavaScriptView Raw
1var iterate = require('./lib/iterate.js')
2 , initState = require('./lib/state.js')
3 , terminator = require('./lib/terminator.js')
4 ;
5
6// Public API
7module.exports = parallel;
8
9/**
10 * Runs iterator over provided array elements in parallel
11 *
12 * @param {array|object} list - array or object (named list) to iterate over
13 * @param {function} iterator - iterator to run
14 * @param {function} callback - invoked when all elements processed
15 * @returns {function} - jobs terminator
16 */
17function parallel(list, iterator, callback)
18{
19 var state = initState(list);
20
21 while (state.index < (state['keyedList'] || list).length)
22 {
23 iterate(list, iterator, state, function(error, result)
24 {
25 if (error)
26 {
27 callback(error, result);
28 return;
29 }
30
31 // looks like it's the last one
32 if (Object.keys(state.jobs).length === 0)
33 {
34 callback(null, state.results);
35 return;
36 }
37 });
38
39 state.index++;
40 }
41
42 return terminator.bind(state, callback);
43}