Callbacks & Callback Hell

What pattern does this implementation demonstrate?
function sequence(tasks, finalCallback) {
  const results = [];
  function next(index) {
    if (index === tasks.length) {
      return finalCallback(null, results);
    }
    tasks[index]((err, result) => {
      if (err) return finalCallback(err);
      results[index] = result;
      next(index + 1);
    });
  }
  next(0);
}
Next Question (12/20)