Async Promises in Sequence

Array.reduce() & for loop run in Sequence.

async function asyncSequence(promises, callback) {
  const results = [];
  const errors = [];
  for (let promise of promises) {
    try {
      res = await promise;
      results.push(res);
    } catch (err) {
      errors.push(err);
    }
  }
  callback(results, errors);
}
function asyncSequence(promises, callback) {
  const results = [];
  const errors = [];
  let completed = 0;

  promises.reduce((prev, curr) => {
    return prev.finally(() => {
      return curr
        .then((val) => {
          results.push(val);
        })
        .catch((err) => {
          errors.push(err);
        })
        .finally(() => {
          completed++;
          if (completed === promises.length) {
            callback(results, errors);
          }
        });
    });
  }, Promise.resolve());
}

function createAsyncTask(value) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (value < 5) {
        reject("Error: " + value);
      } else {
        resolve(value);
      }
    }, value * 1000);
  });
}

let tasks = [
  createAsyncTask(4),
  createAsyncTask(1),
  createAsyncTask(7),
  createAsyncTask(2),
  createAsyncTask(9),
  createAsyncTask(6),
];

asyncSequence(tasks, (results, errors) => {
  console.log("Result", results);
  console.log("Error", errors);
});

// [7, 9, 6]
// (3) ['Error: 4', 'Error: 1', 'Error: 2']