Промисы, как и колбеки, позволяют выполнять асинхронные операции параллельно. Причём умеют делать это в автоматическом режиме, без ручного отслеживания окончания одной из операций. Для этого достаточно собрать массив из промисов и передать их в функцию Promise.all. В результате вернётся обычный промис, на основе которого можно строить дальнейшую цепочку. Данными в первом then будет массив с данными всех выполненных операций.

import { promises as fs } from 'fs';

const unionFiles = (inputPath1, inputPath2, outputPath) => {
  const promise1 = fs.readFile(inputPath1, 'utf-8');
  const promise2 = fs.readFile(inputPath2, 'utf-8');
  const promise = Promise.all([promise1, promise2]);
  // Обязательно делать возврат!
  return promise.then(([data1, data2]) => fs.writeFile(outputPath, `${data1}${data2}`))
};

Получился эффективный код, который ещё и легко понять. К тому же здесь нет дополнительных переменных. Promise.all хоть и возвращает данные в том же порядке, в котором в него были переданы промисы, он не гарантирует последовательность выполнения операций. Не рассчитывайте на это никогда, все операции запускаются одновременно, и какая из них выполнится раньше или позже — неизвестно.

Довольно часто Promise.all используют в ситуациях, когда количество операций заранее неизвестно:

const promises = filepaths.map(filepath => fs.readFile(filepath, 'utf-8'));
const promise = Promise.all(promises);

В этом коде формируется массив промисов, который отдаётся в Promise.all.

Ещё одна особенность Promise.all связана с ошибками. Если хотя бы одна операция вернёт ошибку, то весь промис будет отмечен, как выполненный с ошибкой, а значит управление попадёт в ближайший catch. Чтобы этого избежать, можно передавать в Promise.all не просто промисы, а промисы с повешенными на них обработчиками ошибок catch, из которых уже возвращаются данные с пометкой об успешности.

const promises = filepaths.map(filepath => fs.readFile(filepath, 'utf-8')
  .then(v => ({ result: 'success', value: v }))
  .catch(e => ({ result: 'error', error: e })));
const promise = Promise.all(promises);

Дополнительные материалы

  1. Promise.all

Для продолжения нужно перейти в курс и вступить в него.