Реализуй функцию, которая создаёт массив промисов и последовательно выполняет их через метод перебора. Если промис выполнился успешно, продолжай выполнение следующего; если произошёл reject — обработай ошибку через catch. В какой момент должен вызываться финальный resolve, если все промисы выполнились успешно?

Для последовательного запуска нужен массив функций, создающих Promise, а не уже запущенных промисов; итог завершается после последней задачи.

Короткий ответ

Что ответить на собеседовании

Для последовательного запуска нужен массив функций, создающих Promise, а не уже запущенных промисов; итог завершается после последней задачи.

Подробный разбор

Ответ с пояснениями

Для последовательного запуска нужен массив функций, создающих Promise, а не уже запущенных промисов; итог завершается после последней задачи.

Вариант с остановкой при первой ошибке:

function runSequential(tasks) {
  return tasks.reduce(
    (chain, task) => chain.then(async results => {
      const value = await task();
      results.push(value);
      return results;
    }),
    Promise.resolve([])
  );
}
runSequential([() => Promise.resolve(1), () => Promise.resolve(2)])
  .then(results => console.log(results))
  .catch(error => console.error(error));

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

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее