async-parallel-impl

implementation of async parallel

by upigilam

JavaScript

/**
 * async.parallel()
 */
function parallel(tasks, finalCb = () => null) {
    if (!Array.isArray(tasks)) {
        throw new TypeError('First arg must be an array');
    }

    if (typeof finalCb !== 'function') {
        finalCb = () => null;
    }

    const results = [];
    let numReturned = 0;
    let hasFinalCbBeenCalled;

    tasks.forEach((task, i) => {
        if (typeof task !== 'function') {
            throw new TypeError('Tasks must be functions');
        }
        console.log('task :: ', task);

        task((err, result) => {
            if (err) {
                // We only want finalCb to be called once
                if (!hasFinalCbBeenCalled) {
                    hasFinalCbBeenCalled = true;
                    finalCb(err);
                }
                return;
            }

            results[i] = result;
            numReturned++;
            if (numReturned === tasks.length) {
                finalCb(null, results);
            }
        });
    });
}

// Calling it:
const fns = [
	fn1 = (cb) => setTimeout(() => cb(null, 'success after 700ms'), 700),
	fn2 = (cb) => setTimeout(() => cb(null, 'success after 200ms'), 200),
	fn3 = (cb )=> setTimeout(() => cb(null, 'success after 300ms'), 500),
];

parallel(fns, (err, results) => {
	if(err) {
  	console.log('error: ', err);
  } else {
	  console.log('results :: ',results)
  }
	/// results = ['700', '200', '300']
});