Для последовательного запуска нужен массив функций, создающих Promise, а не уже запущенных промисов; итог завершается после последней задачи.
Реализуй функцию, которая создаёт массив промисов и последовательно выполняет их через метод перебора. Если промис выполнился успешно, продолжай выполнение следующего; если произошёл reject — обработай ошибку через catch. В какой момент должен вызываться финальный resolve, если все промисы выполнились успешно?
Для последовательного запуска нужен массив функций, создающих 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, ошибку каждой задачи следует превращать в результат явно — это другой контракт.