DEV Community

Bukunmi Odugbesan
Bukunmi Odugbesan

Posted on

Coding Challenge Practice - Question 91

The task is to implement the async function helper parallel()

The boilerplate code

function parallel(funcs){
  // your code here
}
Enter fullscreen mode Exit fullscreen mode

The parallel function is supposed to accept an array of async functions, run all the functions at the same time, with each function having the form func(callback).

If there are no functions

if (funcs.length === 0) {
  callback(undefined, []);
  return;
}
Enter fullscreen mode Exit fullscreen mode

Store the outputs by index, count the finished tasks and ensure the callback fires only once

const results = [];
let completed = 0;
let hasError = false;
Enter fullscreen mode Exit fullscreen mode

To run all the functions in parallel

funcs.forEach((func, index) => {
  func((error, result) => {
Enter fullscreen mode Exit fullscreen mode

To prevent multiple callbacks

if (hasError) return;
Enter fullscreen mode Exit fullscreen mode

To handle errors

if (error) {
  hasError = true;
  callback(error, undefined);
  return;
}
Enter fullscreen mode Exit fullscreen mode

To preserve the order even if tasks finish out of order

results[index] = result;
Enter fullscreen mode Exit fullscreen mode

The callback should be called when all the tasks are completed

completed++;

if (completed === funcs.length) {
  callback(undefined, results);
}
Enter fullscreen mode Exit fullscreen mode

The final code

function parallel(funcs){
  // your code here
  return function (callback) {
    if(funcs.length === 0) {
      callback(undefined, []);
      return;
    }

    const results = [];
    let completed = 0;
    let hasError = false;

    funcs.forEach((func, index) => {
      func((error, result) => {
        if(hasError) return;

        if(error) {
          hasError = true;
          callback(error, undefined);
          return;
        }
        results[index] = result;
        completed++;

        if (completed === funcs.length) {
          callback(undefined, results)
        }
      })
    })
  }
}
Enter fullscreen mode Exit fullscreen mode

That's all folks!

Top comments (0)